渐近符号总结

在学习算法的时候,一个很重要的部分就是复杂度分析,或者说是叫做渐进分析,本文简单总结了相应的符号的意思。

1. Big O - O(g(n))O(g(n)) - 上界 (Upper Bound)

  • 定义: f(n)=O(g(n))f(n) = O(g(n)) 当且仅当存在常数 c>0c > 0n0n_0,使得对于所有 nn0n \geq n_0

    f(n)cg(n)f(n) \leq c \cdot g(n)

  • 含义: f(n)f(n) 的增长不会超过 g(n)g(n)(最坏情况)

  • 例子: 3n2+5n=O(n2)3n^2 + 5n = O(n^2),也可以说 =O(n3)= O(n^3)(但不够紧)


2. Big Omega - Ω(g(n))\Omega(g(n)) - 下界 (Lower Bound)

  • 定义: f(n)=Ω(g(n))f(n) = \Omega(g(n)) 当且仅当存在常数 c>0c > 0n0n_0,使得对于所有 nn0n \geq n_0

    f(n)cg(n)f(n) \geq c \cdot g(n)

  • 含义: f(n)f(n) 的增长至少是 g(n)g(n)(最好情况的下界)

  • 例子: 3n2+5n=Ω(n2)3n^2 + 5n = \Omega(n^2),也可以说 =Ω(n)= \Omega(n)(但不够紧)


3. Big Theta - Θ(g(n))\Theta(g(n)) - 紧界 (Tight Bound)

  • 定义: f(n)=Θ(g(n))f(n) = \Theta(g(n)) 当且仅当 f(n)=O(g(n))f(n) = O(g(n)) f(n)=Ω(g(n))f(n) = \Omega(g(n))

    即存在常数 c1,c2>0c_1, c_2 > 0n0n_0,使得对于所有 nn0n \geq n_0

    c1g(n)f(n)c2g(n)c_1 \cdot g(n) \leq f(n) \leq c_2 \cdot g(n)

  • 含义: f(n)f(n)g(n)g(n) 的增长率相同

  • 例子: 3n2+5n=Θ(n2)3n^2 + 5n = \Theta(n^2)


4. Little o - o(g(n))o(g(n)) - 严格上界 (Strict Upper Bound)

  • 定义: f(n)=o(g(n))f(n) = o(g(n)) 当且仅当对于任意常数 c>0c > 0,存在 n0n_0 使得对于所有 nn0n \geq n_0

    f(n)<cg(n)f(n) < c \cdot g(n)

    等价于: limnf(n)g(n)=0\lim_{n \to \infty} \frac{f(n)}{g(n)} = 0

  • 含义: f(n)f(n) 增长严格慢于 g(n)g(n)

  • 例子: n=o(n2)n = o(n^2),但 n2o(n2)n^2 \neq o(n^2)


5. Little omega - ω(g(n))\omega(g(n)) - 严格下界 (Strict Lower Bound)

  • 定义: f(n)=ω(g(n))f(n) = \omega(g(n)) 当且仅当对于任意常数 c>0c > 0,存在 n0n_0 使得对于所有 nn0n \geq n_0

    f(n)>cg(n)f(n) > c \cdot g(n)

    等价于: limnf(n)g(n)=\lim_{n \to \infty} \frac{f(n)}{g(n)} = \infty

  • 含义: f(n)f(n) 增长严格快于 g(n)g(n)

  • 例子: n2=ω(n)n^2 = \omega(n),但 n2ω(n2)n^2 \neq \omega(n^2)


总结表格

符号 含义 类比
f=O(g)f = O(g) fcgf \leq c \cdot g \leq
f=Ω(g)f = \Omega(g) fcgf \geq c \cdot g \geq
f=Θ(g)f = \Theta(g) c1gfc2gc_1 g \leq f \leq c_2 g ==
f=o(g)f = o(g) f<cgf < c \cdot g (任意cc) <<
f=ω(g)f = \omega(g) f>cgf > c \cdot g (任意cc) >>

常见增长率排序(从慢到快)

1<logn<n<n<nlogn<n2<n3<2n<n!<nn1 < \log n < \sqrt{n} < n < n \log n < n^2 < n^3 < 2^n < n! < n^n