问题:
1 + 2 + 3 + ...... + 100 = ?
算法1:
int sum=0;
int n=100;
for(int i=1;i<=n;i++){
sum += i;
}
System.out.println(sum);
算法2:
int sum=0;
int n=100;
sum=(1 + n)*n/2;
System.out.println(sum);
影响算法效率的因素:
1.算法的内容
2.编译的质量 依赖编译器
3.问题的规模
4.机器执行指令的速度 依赖硬件
可控的影响因素:
算法 规模
算法1 n
算法2 n
一个算法的执行数量 f(n) 是n的一个函数
一个算法的时间复杂度 O(f(n)) 是执行数量经过一个规则得到的结果
执行数量计算时间复杂度的规则:
取最高项 影响f(n)数值变化的最主要因素
去掉常量 随着n的增长,该值可忽略
去掉最高项的系数 随着n的增长,该值可忽略
去掉低次项 随着n的增长,该值可忽略
没有最高项,值为常量1
3 --> O(1)
n --> O(n)
2n+1 --> O(n)
n^2 + 3n + 1 --> O(n^2)
log2 n --> O(log n)
算法1的时间复杂度:O(n)
算法2的时间复杂度:O(1)
int x = 0;
int sum = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
x++;
sum += x;
}
}
f(n) = n * n;
时间复杂度:O(n^2)
int x = 0;
int sum = 0;
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
x++;
sum += x;
}
}
f(n) = n + (n-1) + (n-2) + ...... +1 = (n + 1) * n / 2 = n^2/2 + n/2;
时间复杂度为:O(n2)
效率:
O(1) < O(log n) < O(n) < O(n*log n) < O(n^2) < O(n^3) < O(n!) ......
从f(n)转O(n)比较简单,问题是怎么计算f(n),需要数学的知识。