概述
解决问题方法的效率,与算法的巧妙程度和所占的空间大小是有关系的。算法笨拙,消耗的时间就相对较多;空间占用过高,可能导致程序最终没有结果就已经崩溃。
复杂度
空间复杂度S(n)——根据算法写成的程序在执行时占用存储单元的长度。
时间复杂度T(n)——根据算法写成的程序在执行时消耗时间的长度。
复杂度的渐进表示法
为什么我们常看到的复杂度表示是O(n),这就是复杂度的渐进表示法
O(n) 表示复杂度的最小是上界
Ω(n) 表示复杂度的最大下界
Θ(n) 表示既是复杂度的上界,又是复杂度的下界
常见复杂度量级
函数由上至下,时间复杂度越来越大
作为一个程序员,如果看到一个复杂度是,第一个想法就是是否能降成n
输入规模n | ||||||
函数 | 1 | 2 | 4 | 8 | 16 | 32 |
1 | 1 | 1 | 1 | 1 | 1 | 1 |
0 | 1 | 2 | 3 | 4 | 5 | |
n | 1 | 2 | 4 | 8 | 16 | 32 |
n | 0 | 2 | 8 | 24 | 64 | 160 |
1 | 4 | 16 | 64 | 256 | 1024 | |
1 | 8 | 64 | 512 | 4096 | 32768 | |
2 | 4 | 16 | 256 | 65536 | 4.29* | |
n! | 1 | 2 | 24 | 40326 | 2.09* | 2.6* |
复杂度分析窍门
如果有两段算法,我们知道两端算法的复杂度上界是O(f1(n))、O(f2(n))
当把这两个算法没有嵌套时,复杂度是max(O(f1(n)),O(f2(n)))
当两个算法有嵌套时,复杂度是O(f1(n)*f2(n))
一个for循环的时间复杂度=循环次数*循环体代码复杂度
if else结构的复杂度,取决于if的条件复杂度、两个分支的复杂度,三者中复杂度最大的。