算法设计与分析:时间复杂度

参考资料:北大公开课 算法设计与分析 屈婉玲教授

函数渐近的界

O

ffgg 是定义域为自然数集 NN 上的函数,若存在正数 ccn0n_0,使得对一切的 nn0n\leq n_0

0f(n)cg(n)0 \leq f(n) \leq cg(n)

  • 注意公式内为 \leq
  • 定义域为自然数 NN,因为问题规模总是自然数;
  • 这个不等式允许在 n<n0n < n_0 的情况下不成立;
  • cc 只要指出其中一个即可

成立,则称 f(n)f(n) 渐近的上界g(n)g(n),记作:

f(n)=O(g(n))f(n) = O(g(n))

注意

f(n)=O(g(n))f(n) = O(g(n)) 中,f(n)f(n) 的阶小于等于 g(n)g(n) 的阶

Ω

ffgg 是定义域为自然数集 NN 上的函数,若存在正数 ccn0n_0,使得对一切的 nn0n\leq n_0 (前面与 O(n)O(n) 相同)有:

0cg(n)f(n)0 \leq cg(n) \leq f(n)

成立,则称 f(n)f(n)渐近的下界g(n)g(n) ,记作

f(n)=Ω(g(n))f(n) = \Omega(g(n))

  • O(n)O(n) 表示 g(n)g(n)f(n)f(n) 的渐近上界,Ω(n)\Omega(n) 表示 g(n)g(n)f(n)f(n) 的渐近下界;
  • f(n)f(n) 的阶不低于 g(n)g(n) 的阶;

o

ffgg 是定义域为自然数集 NN 上的函数,对任意的正数 cc,都存在 n0n_0,使得 nn0n \geq n_0

0f(n)<cg(n)0 \leq f(n) < cg(n)

若成立,则记作

f(n)=o(g(n))f(n) = o(g(n))

  • g(n)g(n) 增长得比 f(n)f(n)
  • g(n)g(n)f(n)f(n) 的上界

ω

o(n)o(n) 类似,表示的是下界且 g(n)g(n) 增长得比 f(n)f(n) 慢。

0cg(n)<f(n)0 \leq cg(n) < f(n)

  • f(n)f(n) 的阶高于 g(n)g(n)
  • g(n)g(n)f(n)f(n) 的下界

Θ/θ

f(n)=Ω(g(n))f(n)=O(g(n))f(n) = \Omega(g(n)) \\ f(n) = O(g(n))

若上面两条等式成立,即 g(n)g(n) 同时为 f(n)f(n) 的渐近上界和渐近下界,则称

f(n)=Θ(g(n))f(n) = \Theta(g(n))

表示的是:

  • f(n)f(n)g(n)g(n) 的阶相等;
  • 允许前面有限(max(n01,n02)max(n_{01},n_{02}))个 nn 值不满足条件。

有关函数的界的重要定理

极限与函数的界

cc 为某个常数且 c>0c > 0

limnf(n)g(n)=c    f(n)=Θ(g(n))limnf(n)g(n)=0    f(n)=o(g(n))limnf(n)g(n)=+    f(n)=ω(g(n))\lim_{n\rightarrow \infty}\frac{f(n)}{g(n)} = c \iff f(n) = \Theta(g(n)) \\ \lim_{n\rightarrow \infty}\frac{f(n)}{g(n)} = 0 \iff f(n) = o(g(n)) \\ \lim_{n\rightarrow \infty}\frac{f(n)}{g(n)} = +\infty \iff f(n) = \omega(g(n))

多项式函数和指数函数

指数函数的阶大于多项式函数的阶

nd=o(rn)r>1,d>0n^d = o(r^n) \\ r>1, d>0

对数函数和幂函数

lnn=o(nd)d>0\ln n = o(n^d) \\ d>0

对数函数的阶低于幂函数的阶

传递性

O,Ω,ΘO, \Omega, \Theta 关系具有传递性

O 和定理

f=O(h)g=O(h)f+g=O(h)f = O(h) \\ g = O(h) \\ \rightarrow f + g = O(h)

重要函数

级别 函数
指数级 2n,3n,n!2^n, 3^n,n!
多项式级 n,n2,nlogn,n12n,n^2,n\log n,n^{\frac{1}{2}}
对数多项式级 logn,log2n,loglogn\log n, \log^2n,\log\log n
  • 对数函数的底不影响它的阶,所以不关注它的底
  • alogbn=nlogbaa^{\log_bn} = n^{\log_b a}

指数函数和阶乘

n!=o(nn)n!=ω(2n)log(n!)=Θ(nlogn)n! = o(n^n) \\ n! = \omega(2^n) \\ \log(n!) = \Theta(n\log n)

序列求和

等差、等比与调和级数

k+1nak=n(a1+an)2k=0naqk=a(1qn+1)1q,k=0aqk=a1q(q<1)k=1n1k=lnn+O(1)\sum^n_{k+1}a_k = \frac{n(a_1 + a_n)}{2} \\ \sum^n_{k=0}aq^k = \frac{a(1-q^{n+1})}{1-q},\sum^\infty_{k=0}aq^k = \frac{a}{1-q}(q<1) \\ \sum^n_{k=1}\frac{1}{k} = \ln n + O(1)

  • 注意这里面等比数列求和是从 k=0k=0 开始的,所以最终有 n+1n+1 个项,分子是 qn+1q^{n+1}