算法
数据结构+算法=程序设计
举个例子:求1+2…+100
用C解
#include<stdio.h>
int main() {
int i, sum = 0;
for (i = 1; i <= 100; i++) {
sum+=i;
}
printf("%d", sum);
}
输出结果:
5050
java解
public class Test {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println(sum);
}
}
输出结果:5050
1、什么是算法呢?
算法是由若干条指令所组成的有穷序列,其中每条指令表示计算机的一个或多个操作。
2、算法的特性
(1)有穷性
(2)确定性:每条指令都有确定含义,不会出现二义性。
(3)可行性
(4)输入:有0个或多个输入
(5)输出:至少有一个或多个输出
3、算法设计的要求
(1)正确性
(2)可读性
(3)健壮性:当有非法数据时,算法应做出相应的处理。
(4)高效性
(5)低存储量
4、算法的效率(重点)
//第一种算法
int i, sum = 0,n=100; //执行1次
for (i = 1; i <= n; i++) { //执行n+1次
sum+=i; // 执行n次
}
//第二种算法
int sum=0,n=100; //执行1次
sum=(1+n)*n/2; //执行1次
分析:
第一种算法执行了 1+(n+1)+n=2n+2次
第二种算法执行了1+1=2次
时间复杂度
一个算法所需要的执行时间就是该算法中所有语句执行次数之和。当n逐渐增大时T(n)的极限情况,一般简称为时间复杂度。
大写字母O表示数量级,如:3n+4的数量级与n的数量级相等。如:T(n)=3n^2+ 5 n+4,其中 3n^2+5n+4的数量级与 n^2的数量级相同,所以 T(n)=O(n^2)。
当T(n)为多项式时,可只取其最高次幂项并省略其系数,其他的次幂项及系数均略去不写。一般地,对于足够大的n,常用的时间复杂度的大小次序如下 :
O(1)<O(log2(n))<O(n)<O(nlog2(n))<O(n^2) < O(n^3) <O(2^n)
算法的时间复杂度的数量级越大,表示该算法效率越低。(就像比赛中的跑步,时间越少,跑的很好,能拿到冠军)
java解
public class Test {
public static void main(String[] args) {
long startTime=System.nanoTime();
int i, j, x = 0, sum = 0, n = 100;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
x++;
sum += i;
}
}
long endTime=System.nanoTime();
System.out.println(endTime-startTime+"ns");
System.out.println(sum);
}
}
输出结果:
public class Test {
public static void main(String[] args) {
long startTime=System.nanoTime();
int sum=0,n=10000;
sum=(1+n)*n/2;
long endTime=System.nanoTime();
System.out.println(endTime-startTime+"ns");
System.out.println(sum);
}
}
输出结果:
通过比较,显而易见,一个好的算法用的时间少,高效性。
空间复杂性
一个算法的空间复杂度是指程序运行开始到结束所需要的存储空间。
包括算法本身所占有的空间
输入/输出数据占有的存储空间
算法在运行过程中的工作单元和实现算法的所需辅助空间。
算法的所需存储的量度记作:S(n)=O(f(n))
在进行时间复杂度分析时,如果所占空间依赖于特定的输入,一般都是按照最差情况来分析。