解决问题方法的效率,与算法的巧妙程度和所占的空间大小是有关系的。算法笨拙,消耗的时间就相对较多;空间占用过高,可能导致程序最终没有结果就已经崩溃。
空间复杂度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的条件复杂度、两个分支的复杂度,三者中复杂度最大的。