一 平均时间复杂度
有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同
1 2 3 4
| 例:顺序查找,在数组a[i]中查找值等于e的元素,返回其所在的位置 for(i=0;i<n;i++) if(a[i]==e)return i+1;//找到,则返回是第几个元素 return 0;
|
- 最好情况:1次
- 最坏情况:n
- 平均时间复杂度为:O(n)
二 时间复杂度说明
- 最坏时间复杂度:指在最坏情况下,算法的时间复杂度
- 最好时间复杂度:指在最好情况下,算法的时间复杂度
- 平均时间复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间
一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长
三 计算时间复杂度规则——加法规则和乘法规则
对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大O加法法则和乘法法则,计算算法的时间复杂度
3.1 加法规则
1
| T(n)+T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
|
3.2 乘法规则
1
| T(n)+T1(n)xT2(n)=O(f(n))xO(g(n))=O(max(f(n)xg(n)))
|
四 算法效率的比较
4.1多项式算法时间比较
n |
f(1) |
f(logn) |
f(nlog) |
f(n2) |
f(n3) |
f(2n) |
f(n!) |
1 |
1 |
0 |
0 |
1 |
1 |
2 |
1 |
2 |
1 |
1 |
2 |
4 |
8 |
4 |
2 |
4 |
1 |
2 |
4 |
16 |
64 |
16 |
24 |
8 |
1 |
3 |
8 |
64 |
512 |
256 |
40320 |
16 |
1 |
4 |
24 |
256 |
4096 |
65536 |
2.0923E+13 |
32 |
1 |
5 |
160 |
1024 |
32768 |
4.295E+09 |
2.6313E+35 |
4.2 多项式的递增顺序
常数阶 |
对数阶 |
线性阶 |
线性对数阶 |
平方阶 |
立方阶 |
... |
K次方阶 |
指数阶 |
O(1) |
O(log2n) |
O(n) |
O(nlog2n) |
O(n2) |
O(n3) |
|
O(nk) |
O(n2n) |
五 空间复杂度
5.1 概念
空间复杂度
- 空间复杂度:算法所需存储空间的度量
- 记作:S(n)=O(f(n)),其中n为问题的规模(或大小)
算法要占据的空间
- 算法本身要占据的空间,输入/输出,指令、常数、变量等
- 算法要使用的辅助空间
5.2 示例
示例一
将一维数组a中的n个数逆序存放到原数组中
1 2 3 4 5
| 【算法1】 for(i=0;i<n/2;i++) t=a[i]; a[i]=a[n-i-1]; a[n-i-1]=t;
|
说明:S(n)=O(1),原地工作
1 2 3 4 5
| 【算法2】 for(i=0;i<n/2;i++) b[i]=a[n-i-1]; for(i=0;i<n;i++) a[i]=b[i];
|
说明:S(n)=O(n);
六 设计好算法的过程