Algorithm Design · Lecture 2-2

Big-O 工具箱:九条实用性质Big-O Notation: Useful Properties

上一课每证一个 Big-O,都要亲手挑 c、挑 n₀、写链条——像每次做饭都从种麦子开始。这一课把九条性质一次性证好、装进工具箱:从此丢常数、定多项式、比对数指数,几乎再也不用碰 c 和 n₀。但有一条铁律:每件工具入箱前,必须先用定义证明它

✓ 对不对 ✓ 怎么数 ✓ 尺子:定义 ✓ 硬磕:实战 ▶ 工具箱:九条性质
Ke Chen · May 21, 2026 承接 Lecture 2-1 可交互 中英双语
向下滚动开始 · scroll to begin
01

工具箱开张 / Why properties?

教授开宗明义:上个视频我们反复直接套定义;这个视频要从定义推导出一批可复用的性质,让"证 f = O(g)"变得省力。

入箱铁律 · 教授原话 "We cannot just state the property and pretend they're true — we have to rigorously prove that they are indeed true."(不能光把性质写出来就假装它成立——必须严格证明。)而证明性质时,手里能用的只有定义本身("all we had in hand is the definition itself")。所以这节课的每条性质都自带一段"回到定义"的证明——先付款,后使用。

九条性质,按用途分成四组。这就是今天的货架:

性质一句话
积木P1 · P2 · P3丢常数 / 比幂次 / 加法合并——多项式的三块积木§02 ↓
推论P4多项式一眼定档:只看最高次项§03 ↓
比大小P5 · P6 · P7多项式碾压对数 / log 底数无所谓 / 指数碾压多项式§04 ↓
组合器P8 · P9传递性 / 乘法法则——把已知的 O 拼成新的 O§07 ↓
本课的隐藏主线:一个可复用的证明骨架 你会看到同一招式反复出现——拆包 (unpack) → 拼装 (combine) → 打包 (repack):把"已知的 O"用定义翻译成不等式,把几条不等式拼起来,再指着新常数说"看,这也是一张证书"。P3、P8、P9 全是这一个骨架。学会它,你就能自己造新工具。
02

三块积木:丢常数 · 比幂次 · 加法合并 / P1 · P2 · P3

先上三条最基本的。前两条的证明各只有一行;第三条是本课第一次完整演示"拆包→拼装→打包"。

P1 · 乘法常数直接丢 a·f(n) = O(f(n))

这正是我们发明 Big-O 的两大动机之一(另一个是无视小 n)。乘常数是把函数曲线整体"拉伸"——绝对值变了,增长率纹丝不动。证明就一行:

要证 a·f(n) ≤ c·f(n):取 c = a,n₀ = 1,不等式变成 a·f(n) ≤ a·f(n)。∎

教授补充:c 取 a+1 也行,任何 ≥ a 的 c 都行——又见"证书不唯一"。

P2 · 幂次定胜负 nb = O(na),只要 a ≥ b

幂越高,增长越快——所以低幂 = O(高幂)。证明更短:取 c = 1, n₀ = 1,不等式 nb ≤ na 两边同除 nb(n ≥ 1 时合法)变成 1 ≤ na−b,因 a ≥ b 显然成立。∎ 注意方向:a ≥ b 才行,别写反。

P3 · 同档相加,档次不变 f = O(h) 且 g = O(h) ⇒ f + g = O(h)

直觉(教授版):f 和 g 都是"增长不超过 h 的慢家伙",两个慢家伙加在一起,也别指望追上 h。但直觉不算数——这条的证明要"用三次定义":两条已知的 O 各拆包一次,要证的 O 打包一次。亲手走一遍:

互动 · 定义拆包机:P3 的证明骨架
这一步在干嘛?点"下一步",从两条已知条件开始。
记住这台拆包机 新证书是 (c + c′, max{n₀, n₀′}):常数相加(两个上界叠起来),门槛取 max(要两条不等式同时生效,就得等两个门槛都过了)。§07 的传递性用的是同一台机器,只是常数变成相乘
03

推论:多项式一眼定档 / P4 · Polynomials are easy

三块积木一拼,多项式立刻缴械:adnd + ad−1nd−1 + … + a₁n + a₀ = O(nd)。按幂次降序排好,最高次项 (leading term) 一个人决定整个函数的档次。

证明配方:每一项 aknk --P1→ O(nk) --P2→ O(nd),再用 P3 把所有项合并 → 整体 = O(nd)。∎
互动 · 多项式定档机 + 首项份额仪

选一个多项式,看谁是首项;再拖动 n,看首项在整个函数值里的占比怎么走向 100%——"低次项迟早沦为零头"的实感:

3n² + 5n + 9999 0.001n⁵ + 999n⁴ + 10⁶ 42n + 7
n = 10110
留意第二个例子 0.001n⁵ + 999n⁴ + 10⁶ 首项系数只有 0.001,在 n = 10⁵ 时它的占比还不到一半——要到 n ≈ 10⁶ 附近才真正当家。Big-O 的结论(O(n⁵))毫不动摇,但"迟早"有时真的很迟。这个观察 §09 的陷阱里还会回来。
04

多项式碾压对数 / P5 · Polynomial dominates logarithm

(log n)a = O(nb),对任意常数 a, b > 0。注意量词的狂妄:a 可以是 100,b 可以是 0.01——对数的任何次幂,都翻不过多项式的任何正次幂。

讲义例子:(log n)³ = O(n), (log n)100 = O(n0.01)

先别急着信——亲眼看一场。下面的赛道上,蓝线是对数的幂,绿线是多项式。注意小 n 处谁在赢:

互动 · 对数 vs 多项式:一场先甜后苦的赛跑
(log₂n)² vs n (log₂n)³ vs n
对数的幂(挑战者)n(多项式)
可见范围 n ≤40
那 (log n)¹⁰⁰ vs n⁰·⁰¹ 呢?画不出来,算给你看 交叉点在 n ≈ 2174000 之后——那是一个约 5.2 万位的十进制数(宇宙原子数才 80 位)。在任何物理可能的输入上,(log n)¹⁰⁰ 都远大于 n⁰·⁰¹;但 Big-O 判的是尾巴,对数照样认输。"渐近"是数学承诺,不是工程预报——两件事都要拿得住。

证明呢?教授原话:"I will skip this proof. You can read it line by line."(这个证明我课上跳过,你们逐行读。)那我们就逐行读——每一步只用初等对数技巧:

逐行读:P5 的证明(讲义全文+注解) · Write-up
第 1 行 对数恒等式:log n = (a/b) · log nb/a。(把指数 b/a 从 log 里提出来,恰好凑出 a/b 的系数——为最后"升 a 次方"做准备。)
第 2 行 基本事实:log x ≤ x 对所有 x ≥ 1。(对数曲线永远压在直线 y=x 下面。)代入 x = nb/a:(a/b)·log nb/a ≤ (a/b)·nb/a,对 n ≥ 1。
第 3 行 两行拼起来:log n ≤ (a/b)·nb/a,对所有 n ≥ 1。
第 4 行 两边升 a 次方(正数上保序):(log n)a ≤ (a/b)a · nb
打包 证书:c = (a/b)a,n₀ = 1。按定义,(log n)a = O(nb)。∎(c 可能巨大——比如 a=100, b=0.01 时是 10000¹⁰⁰——但常数再丑也是常数,上一课已经免疫了。)
05

对数的底数无所谓 / P6 · Base of log is irrelevant

loga n = O(logb n),对任意常数 a, b > 1。计算机科学里写 log 默认底 2(我们用二进制),但写 log₄、log₁₀、ln 都行——因为在 Big-O 眼里全是一回事。

换底公式:loga n = loga b · logb n ——底下划线的就是常数 c。∎

证明就这一行:换个底,只是乘一个常数(loga b 不含 n),P1 直接吃掉。比如 log₂ n = log₂10 · log₁₀ n ≈ 3.32 · log₁₀ n——比值恒为 3.32,一条水平线。

强对比:log 的底数可丢,指数的底数不可丢! 上一课刚证过 4ⁿ ≠ O(2ⁿ)(挑战题 C2),这一课却说 log₄ n = O(log₂ n) 没问题。为什么不对称?看常数落在哪:换 log 的底 = 在外面乘常数(P1 可丢);换指数的底 = 把比值变成 (4/2)ⁿ = 2ⁿ,一个冲向无穷的因子(谁也救不了)。一句话:常数长在乘法位上是软的,长在指数位上是硬的。
06

指数为王:碾压一切多项式 / P7 · Exponential dominates polynomial

na = O(bn),对任意常数 a > 0、b > 1。又是狂妄的量词:哪怕 n¹⁰⁰⁰ 对上 1.1ⁿ,多项式也输。

讲义例子:n99 = O(2n), n1000 = O(1.1n)
互动 · 对决台:多项式 vs 指数
n³ vs 1.1ⁿ n⁹⁹ vs 2ⁿ n¹⁰⁰⁰ vs 1.1ⁿ
规律:多项式先赢一大段(交叉点可能在几百、几千、甚至十几万)——但指数一旦追上,差距立刻裂开成天文数字。"输在何时"因题而异,"必输"是定理。

证明呢?教授原话:"I'll leave that as an exercise."(留作练习。)套路和 P5 那段对数戏法很像——这个练习我们真的会做:挑战题 C4 ↓,等你亲手拆。

07

组合器:传递性 + 乘法法则 / P8 · P9

最后两条不比大小,而是把已知的 O 拼成新的 O——工具箱里的扳手和螺丝刀。

P8 · 传递性 f = O(g) 且 g = O(h) ⇒ f = O(h)

增长率的"≤"当然可以串:f ⪯ g ⪯ h,所以 f ⪯ h。证明又是那台拆包机——两条已知各拆包一次,拼装,打包。唯一的新意:这次两条不等式是串联(代入)而不是并联(相加),所以常数相乘:

f(n) ≤ c·g(n) (n ≥ n₀)  g(n) ≤ c′·h(n) (n ≥ n₀′)
代入:n ≥ max{n₀, n₀′} 时,f(n) ≤ c·g(n) ≤ c·c′·h(n) → 新证书 (c·c′, max{n₀, n₀′})

P9 · 乘法法则 f = O(h₁) 且 g = O(h₂) ⇒ f·g = O(h₁·h₂)

两个函数相乘,上界也相乘。教授特别预告:"这学期我们基本会一路偷偷地用它 (use this implicitly)"——而它最常见的一次出场,就是分析嵌套循环时的 n·log n:

n = O(n), log n = O(n)(P5) --P9→ n·log n = O(n²)

n log n 是排序等算法里最常见的运行时间之一,先混个脸熟。P9 的证明也被留作练习("Proof: Exercise")——它在挑战题 C2 等你,比 P7 那个简单。

拆包机的三次出场,合影留念 P3(并联,常数相加):(c+c′, max)。P8(串联,常数相乘):(c·c′, max)。P9(相乘,常数也相乘):(c·c′, max)。骨架一模一样:拆包已知 → 拼不等式 → 指认新证书。以后你自己要证一条新性质,先想:并联还是串联?
08

实战流水线:一眼看穿怪兽函数 / The assembly line

工具全部入箱。现在来干这节课真正的活:拿到一个乱七八糟的 T(n),全程只报性质编号、不碰 c 和 n₀,把它的档次定出来。

互动 · 怪兽函数流水线
怪兽 A:5n³ + 100n²·log n + (log n)⁷ + 42 怪兽 B:3n¹⁰ + 1000n·log n + 1.01ⁿ
这一步用了哪件工具?点"下一步",开始拆解。
流水线的心法 ① 拆项;② 每项独立定档(丢常数 P1,对数换成多项式 P5,多项式换成指数 P7,乘积用 P9,升档用 P2+P8);③ P3 合并,答案 = 最重那一项的档。见到指数项,多项式全体让路;见到对数,把它当成"比任何 nε 都轻"的小可怜。
09

增长率食物链 + 新陷阱 / The food chain & pitfalls

把 L03 的"增长率阶梯"用今天的三条比大小性质(P5/P6/P7)升级成完整食物链——每一道分界线,现在都有定理撑腰。

O(1)常数 constant
O(log n)对数(底数随便写,P6)P6
O((log n)¹⁰⁰)对数的任何次幂,仍在对数区
—— P5 分界线:对数区全体 ≤ 任何 nε ——
O(n⁰·⁰¹)再小的正幂,也压过全部对数P5
O(n)线性 —— LinearSearch 在这
O(n log n)线性对数(P9 拼出来的,排序常客)P9
O(n²)二次(幂次比大小,P2)P2
O(n¹⁰⁰⁰)多项式区的尽头依然是多项式
—— P7 分界线:多项式区全体 ≤ 任何 bⁿ (b>1) ——
O(1.1ⁿ)底数只要 > 1 就是指数区公民P7
O(2ⁿ) ≠ O(3ⁿ)指数区内部,底数分档(L04 证过)

n log n 卡在 n 和 n² 之间:n·1 ≤ n·log n(n ≥ 2),而 n·log n = O(n·n) = O(n²)(P9)。

本课新增的四个坑 · Pitfalls

常数的位置决定生死
"5n² 能丢 5,那 2⁵ⁿ 也能丢 5" ✗

P1 只管乘法位上的常数。指数位上的 5 是硬的:2⁵ⁿ = 32ⁿ,底数换了,跨档(L04)。丢常数前先问:它长在哪?

log 底可丢,指数底不可丢
"都是底数,待遇凭什么不同" ✗

换 log 底 = 乘常数 logab(P1 吃掉);换指数底 = 乘 (b/a)ⁿ,一个随 n 爆炸的因子。P6 与 L04 挑战题 C2 各管一边。

P2 有方向
n⁵ = O(n³) ✗

nb = O(na) 要求 a ≥ b。低幂钻进高幂的 O 里,不能反着钻。写之前默念:O 是"≤"。

"迟早"可能非常迟
"我实验到 n=10⁶ 还是 log 赢,所以 P5 是错的" ✗

(log n)¹⁰⁰ 要到 n ≈ 2¹⁷⁴⁰⁰⁰ 才输给 n⁰·⁰¹;0.001n⁵ 要到 n ≈ 10⁶ 才压过 999n⁴。有限实验永远证不了也推不翻渐近结论——L04 就说过:单点不是证据。

10

挑战题:教授留的练习,都在这 / Harder problems

四道,难度递增。C2 和 C4 正是讲义里两处 "Proof: Exercise" 的正主——教授留的作业,咱们替他收了。先动笔再看解。

★★ · 拆包机热身
C1. 证明:f + g = O(max(f, g))。(这里 max(f,g) 指逐点取大:m(n) = max{f(n), g(n)}。)

提示:f(n) 和 g(n) 各自与 m(n) 什么关系?一张 (c, n₀) = (2, 1) 的证书就够了。

题解 · Solution
观察 对每个 n:f(n) ≤ m(n) 且 g(n) ≤ m(n)(最大值当然不小于每一个)。
相加 f(n) + g(n) ≤ 2·m(n),对所有 n ≥ 1。
打包 证书 (c, n₀) = (2, 1),故 f + g = O(max(f, g))。∎
品一品 反过来 max(f,g) ≤ f+g 也显然(非负函数)。所以"和"与"最大值"渐近同档——这就是为什么定档时只看最重的项(P4 的另一种说法)。"同档"的正式记号 Θ,下一课登场。
★★★ · 讲义原题:P9 的 "Proof: Exercise"
C2. 从定义出发,证明乘法法则 P9:f = O(h₁) 且 g = O(h₂) ⇒ f·g = O(h₁·h₂)。

提示:拆包两次,然后把两条不等式相乘。想想:不等式相乘,什么时候是合法操作?

题解 · Solution
拆包① 存在 c, n₀:f(n) ≤ c·h₁(n),对 n ≥ n₀。
拆包② 存在 c′, n₀′:g(n) ≤ c′·h₂(n),对 n ≥ n₀′。
拼装 当 n ≥ max{n₀, n₀′}:两条不等式同时成立,且四个量全非负(定义要求 f, g : ℕ → ℝ⁺)——非负不等式可以逐边相乘:f(n)·g(n) ≤ c·c′·h₁(n)·h₂(n)。
打包 新证书 (c·c′, max{n₀, n₀′}),故 f·g = O(h₁·h₂)。∎
品一品 "非负"这个条件平时像空气,这里第一次干活:若允许负值,−2 ≤ 1 和 −3 ≤ 1 相乘会得到 6 ≤ 1 的鬼话。定义里 ℝ⁺ 不是装饰。
★★★ · 方向感测试
C3. 判断真假:若 f = O(g),则 2f(n) = O(2g(n))。对就证明,错就给反例。

提示:上一课有个现成的跨档反例……f 和 g 只差一个乘法常数时,指数上会发生什么?

题解 · Solution
假。
反例 取 f(n) = 2n,g(n) = n。显然 f = O(g)(P1,c=2)。但 2f(n) = 22n = 4ⁿ,而 4ⁿ ≠ O(2ⁿ)——L04 挑战题 C2 刚证过(对任意 c,n > log₂c 就翻车)。∎
教训 Big-O 不能整体搬进指数:O 允许丢的乘法常数,一进指数位就变成底数变化(2ⁿ → 4ⁿ),跨档。和 §09 坑一是同一个魔鬼的两张脸。
★★★★ · 讲义原题:P7 的 "Proof: Exercise"
C4. 证明 P7:na = O(bn),对任意常数 a > 0、b > 1。

提示(教授说套路像 P5):把两边都写成 2 的幂,比较指数;需要"log n 最终小于 εn(ε 任意小)"——这可以从 P5 的显式不等式 log n ≤ (1/δ)·nδ 里榨出来。

题解 · Solution
改写 na = 2a·log n,bn = 2n·log b(log 均为底 2,P6 说了底数随意)。指数函数单调,于是只需证:a·log n ≤ n·log b,对足够大的 n——然后 c = 1 都够用。
借 P5 的显式版 P5 证明的第 3 行给过:log n ≤ (1/δ)·nδ 对所有 n ≥ 1、任意 δ > 0。取 δ = 1/2:log n ≤ 2√n。
压制 想要 a·log n ≤ n·log b,由上一步只需 2a·√n ≤ n·log b,即 √n ≥ 2a/log b,即 n ≥ (2a/log b)²
打包 取 c = 1,n₀ = ⌈(2a/log b)²⌉:对 n ≥ n₀,a·log n ≤ n·log b,故 na = 2a·log n ≤ 2n·log b = bn。∎
品一品 代入 a=1000, b=1.1:log₂1.1 ≈ 0.1375,n₀ ≈ (2000/0.1375)² ≈ 2.1×10⁸。也就是说 n¹⁰⁰⁰ 要"熬"到两亿多才被 1.1ⁿ 全面压制(证书意义上)——再次呼应:定理是铁的,"迟早"是弹性的。
11

随堂小测 / Quick Check

无限次尝试,零压力。七道题,把九件工具各敲一遍。

Q1. 用 P1 证明 500n = O(n),最直接的证书是?
Q2. P3 的证明里,新证书的门槛取 max{n₀, n₀′},是因为?
Q3. 0.5n⁴ + 900n³ + 10⁶ 的档次是?
Q4. (log n)¹⁰⁰ = O(n⁰·⁰¹) 这个说法?
Q5. 下面关于"底数"的说法,哪个是对的?
Q6. 已知 f = O(g)、g = O(h)。下面哪个不一定成立?
Q7. 下面哪个是命题?