一 平均时间复杂度
有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同
例:顺序查找,在数组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 加法规则
T(n)+T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
3.2 乘法规则
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】
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),原地工作
【算法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);