在分析算法效率时,经常关注以下两种复杂度:
(1)最坏情况复杂度:Tworst(n)
(2)平均复杂度:Tavg(n)
易知Tavg(n)<=Tworst(n)
注:一般分析最坏情况复杂度,因为平均复杂度不容易找
下表能够比较直观的看出各个复杂度的运行时间
1 | 2 | 4 | 8 | 16 | 32 | |
C(常函数) | 1 | 1 | 1 | 1 | 1 | 1 |
logn | 0 | 1 | 2 | 3 | 4 | 5 |
n | 1 | 2 | 4 | 8 | 16 | 32 |
nlogn | 0 | 2 | 8 | 24 | 64 | 160 |
n2 | 1 | 4 | 16 | 64 | 256 | 1024 |
n3 | 1 | 8 | 64 | 512 | 4096 | 32768 |
2n | 2 | 4 | 16 | 256 | 65536 | 4294967296 |
n! | 1 | 2 | 24 | 40326 | 2092278988000 | 26313×1033 |
所以一般情况下避免出现后两种复杂度
下图是几种复杂度的增长速度
(图片来自慕课,陈越姥姥那堂课)
复杂度分析的窍门:
- 若已知T1(n) = O(f1(n))和T2(n) = O(f2(n)),则
T1(n) + T2(n) = max(O(f1(n)),O(f2(n))) (就是O(f1(n))和O(f2(n))的最大值)
T1(n) × T2(n) = O(f1(n) × f2(n)) - for循环的T(n) = 循环次数 × 循环体代码的复杂度
- if-else结构的复杂度取决于if的条件判断复杂度和两个分支部分的复杂度,总体复杂度取三者中的最大值
2020-03-19
来源:oschina
链接:https://my.oschina.net/u/4418383/blog/3209362