渐近记号与函数增长

Views: --

渐近分析关心 nn 足够大时的增长速度,忽略常数倍和低阶项。它不是“把公式写得模糊一点”,而是用严格量词描述函数之间的长期关系。

1. 五个渐近记号

f(n),g(n)f(n),g(n) 在充分大的 nn 上非负。

1.1 渐近上界 OO

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

表示存在常数 c>0,n0c>0,n_0,使所有 nn0n\ge n_0 都有

0f(n)cg(n).0\le f(n)\le cg(n).

它只表示“不比 gg 增长得更快”。例如 3n+7=O(n2)3n+7=O(n^2) 也正确,只是不紧。

1.2 渐近下界 Ω\Omega

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

表示存在 c>0,n0c>0,n_0,使 nn0n\ge n_0

0cg(n)f(n).0\le cg(n)\le f(n).

1.3 紧确界 Θ\Theta

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))。也就是 gg 在常数倍意义下准确描述了 ff 的增长阶。

1.4 严格上界 oo 与严格下界 ω\omega

f(n)=o(g(n))    limnf(n)g(n)=0,f(n)=o(g(n)) \iff \lim_{n\to\infty}\frac{f(n)}{g(n)}=0, f(n)=ω(g(n))    limnf(n)g(n)=.f(n)=\omega(g(n)) \iff \lim_{n\to\infty}\frac{f(n)}{g(n)}=\infty.

n=o(n2)n=o(n^2),但 no(n)n\ne o(n)。小写记号排除了“同阶”的情况。

2. 用极限快速比较

考察

L=limnf(n)g(n).L=\lim_{n\to\infty}\frac{f(n)}{g(n)}.
  • 0<L<0<L<\inftyf=Θ(g)f=\Theta(g)
  • L=0L=0f=o(g)f=o(g)
  • L=L=\inftyf=ω(g)f=\omega(g)

极限不存在时,不能直接下结论。例如 f(n)=n(2+sinn)f(n)=n(2+\sin n)nn 的比值不收敛,但始终夹在 nn3n3n 之间,所以仍有 f(n)=Θ(n)f(n)=\Theta(n)

3. 常见增长顺序

对固定常数 k>0k>0a>1a>1

1loglognlogn(logn)knεnnkann!nn.1 \prec \log\log n \prec \log n \prec (\log n)^k \prec n^\varepsilon \prec n \prec n^k \prec a^n \prec n! \prec n^n.

这里 ε>0\varepsilon>0 可以很小。一个重要结论是:任意正次数多项式最终都比任意对数幂增长快,而任意固定底数指数最终都比任意多项式增长快。

对数底数只差常数:

logan=logbnlogba=Θ(logn).\log_a n=\frac{\log_b n}{\log_b a}=\Theta(\log n).

4. 多项式、和与乘积

对多项式

p(n)=adnd++a1n+a0,p(n)=a_dn^d+\cdots+a_1n+a_0,

ad>0a_d>0,则 p(n)=Θ(nd)p(n)=\Theta(n^d)

常用规则:

O(f)+O(g)=O(max{f,g}),O(f)+O(g)=O(\max\{f,g\}), O(f)O(g)=O(fg).O(f)\cdot O(g)=O(fg).

顺序执行的两段程序取较大复杂度;嵌套执行通常相乘。但“循环嵌套”不一定机械相乘,内层迭代次数可能依赖外层变量,必须求和。

5. 常见求和

5.1 等差与幂和

i=1ni=Θ(n2),i=1nik=Θ(nk+1).\sum_{i=1}^n i=\Theta(n^2), \qquad \sum_{i=1}^n i^k=\Theta(n^{k+1}).

5.2 调和级数

i=1n1i=Θ(logn).\sum_{i=1}^n\frac1i=\Theta(\log n).

因此下面循环不是 O(n2)O(n^2)

for i = 1 .. n:
    for j = 1; j <= n; j += i:
        constant_work()

ii 轮约执行 n/in/i 次,总计

ni=1n1i=Θ(nlogn).n\sum_{i=1}^n\frac1i=\Theta(n\log n).

5.3 几何级数

0<r<10<r<1 时,

1+r+r2+=Θ(1).1+r+r^2+\cdots=\Theta(1).

r>1r>1 时,有限几何级数由最后一项主导。这是分析递归树的核心工具。

6. 传递性与对称性

  • OOΩ\OmegaΘ\Theta 都具有传递性;
  • f=Θ(g)f=\Theta(g) 具有对称性;
  • f=O(g)f=O(g) 等价于 g=Ω(f)g=\Omega(f)
  • f=O(g)f=O(g),不能推出 f=Θ(g)f=\Theta(g)

写“算法复杂度是 O(n2)O(n^2)”通常是在报上界。如果已经证明上下界一致,写 Θ(n2)\Theta(n^2) 更准确。

7. 空间复杂度也用同一套记号

原地算法通常指额外空间 O(1)O(1),但要留意:

  • 递归调用栈;
  • 返回数组或复制切片;
  • 哈希表和队列的最坏规模;
  • 输入是否允许被修改。

例如递归二分查找时间 O(logn)O(\log n),递归栈空间也是 O(logn)O(\log n);改成迭代后可降为 O(1)O(1)

8. 易错点

  1. OO 不是“等于最坏情况”,它只是函数上界;最好、平均、最坏三种情况都能使用 OO
  2. 常数在渐近分析中可忽略,但在实际工程里仍可能决定哪个算法更快。
  3. O(2n)O(2n)O(n)O(n) 相同,O(2n)O(2^n)O(n)O(n) 完全不同。
  4. 不能把 O(f)+O(g)O(f)+O(g) 写成 O(f+g)O(f+g) 后就停止;应继续化简到主导项。
  5. 对多参数问题不要强行只写一个 nn,例如图算法应保留 V,EV,E

评论