算法复杂度计算
算法复杂度计算
一、基础
1、单循环
- 时间复杂度:\(O(N)\),进行N次操作
- 空间复杂度:\(O(1)\),变量\(a\)仅使用一个存储空间
a = 0
for i in range(N):
a = a + 1
- 时间复杂度:\(O(N)\),进行\(N/2\)次操作 -> \((1/2)*O(N)\) -> 忽略常数项\(O(N)\)
- 空间复杂度:\(O(1)\),变量\(a\)、\(b\)使用两个存储空间 -> \(2*O(1)\) -> 忽略常数项\(O(1)\)
a, b = 0, 0
for i in range(N/2):
a = a + 1
b = b + 1
- 时间复杂度:\(O(log(N))\),进行\(log(N)\)次操作
- 空间复杂度:\(O(1)\)
a, i = 1, N
while i > 0:
i /= 2
2、多循环
- 时间复杂度:\(O(N^2)\),进行\(N^2\)次操作
- 空间复杂度:\(O(1)\)
a = 0
for i in range(N):
for j in range(N):
a = a + 1
- 时间复杂度:\(O(N^2)\),循环1、2、3...N次,进行\((1+N)*N/2\)次操作 -> \((1/2)* O(N^2) +(1/2)*O(N)\)
- 空间复杂度:\(O(1)\)
a = 0
for i in range(N):
for j in range(i, N - 1):
a = a + 1
3、递归
主定理公式
\[T(n) = aT(n/b)+f(n)
\]
- 若\(O(n^{log_ba})>f(n)\),\(T(n)=O(n^{log_ba})\)
- 若\(O(n^{log_ba})=f(n)\),由\(f(n)=n^{log_ba}log^kn\)计算\(k\),得到\(T(n)=O(n^{log_ba}log^{k+1}n)\)
- 若\(O(n^{log_ba})<f(n)\),\(T(n)=f(n)\)
实例1
\[T(n) = 3T(n/2)+n^2 \]其中\(a\)、\(b\)分别为3、2,\(f(n)=n^2\),则\(f(n)>n^{log_23}\),复杂度为\(O(n^2)\)
实例2
\[T(n) = 2T(n/2)+nlog(n) \]其中\(a\)、\(b\)分别为2、2,先不考虑\(f(n)\)中\(log(n)\)项,则\(f(n)=n^{log_22}log^{k}n=nlog(n)\),即\(k=1\),复杂度为\(O(nlog^2(n))\)
实例3
递归斐波那契数列
- 时间复杂度\(O(2^n)\)
- 空间复杂度\(O(n)\)
4、复杂度比较
在实际计算时,若N足够大,则有如下关系
- \(O(1) < O(log(N)) < O(N) < O(N*log(N)) < O(N^2) < O(N^3) < O(2^N)\)

浙公网安备 33010602011771号