算法复杂度计算

算法复杂度计算

一、基础

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)\)
posted @ 2022-02-12 22:07  lovekey  阅读(311)  评论(0)    收藏  举报