Algorithm Design · Lecture 2-1

Big-O 实战:三个例子与一次反证Big-O Notation: Examples

上一课我们造好了尺子——Big-O 的定义。可是拿到一个具体命题,比如 3n+5 = O(n−3),那对常数 (c, n₀) 到底怎么找?这一课是纯实战:三个例题,每个都藏着一个新机关;最后再把方向掉个头——第一次证明"不是 O"。

✓ 对不对 (correctness) ✓ 怎么数 (T(n)) ✓ 尺子:Big-O 定义 ▶ 用尺子:证 O 与反证 O
Ke Chen · May 21, 2026 承接 Lecture 1-3 可交互 中英双语
向下滚动开始 · scroll to begin
01

从定义到实战 / The battle map

先把尺子请回来。这节课从头到尾只用这一件武器——定义本身,没有任何新定理。

Definition · Big-O(第 03 课原样回放)
对两个函数 f, g : ℕ → ℝ⁺,称 f(n) = O(g(n)),当且仅当
存在常数 c > 0n0 ∈ ℕ,使得
对所有 n ≥ n0,都有 f(n) ≤ c · g(n)
本课的关键视角:证明 = 交出一张"证书" 定义里是两个"存在"——所以证明 f = O(g),你要做的全部事情就是:交出一对具体能用的 (c, n₀),再验证不等式对所有 n ≥ n₀ 成立。我们给这对常数起个外号:certificate(证书)。证书不要求唯一、不要求最优,有效就赢

热身一下,把上一课的老朋友 LinearSearch 办了:它的 T(n) = 10n + 7(常数还是瞎编的那两个),证 T(n) = O(n):

n ≥ 1 时,7 ≤ 7n,故 10n + 7 ≤ 10n + 7n = 17n → 证书 (c, n₀) = (17, 1)

十秒钟搞定。可惜考试和作业里的题不会都这么客气。这节课的三个例子难度逐级上升,每个都专门训练一种"找证书"的手法;最后一节反过来:如果命题是的,你要怎么把它锤死?

战役命题机关 · The twist
例一3n+5 = O(n−3)g 在每个点都更小,居然还能当上界?c 与 n₀ 必须联动求解§02 ↓
例二2n+1 = O(2n)指数上加 1,到底是"大一点"还是"大一档"?§05 ↓
例三(n+10)³ = O(n³)放缩 (bounding) 的艺术:把小零件放大成主项§06 ↓
反证0.01n² ≠ O(n)量词翻转:这次要打赢所有证书§08 ↓

整节课的地图。四场战役共用一把武器:定义。打完你会发现,"会用定义"比"背下定义"值钱得多。

02

例一(破题):一个挑衅的命题 / 3n+5 = O(n−3)?

f(n) = 3n+5,g(n) = n−3。第一眼看上去这题就不对劲:g 不但更小,小 n 时还是负的

随便代几个数:n=10 时 f=35、g=7;n=100 时 f=305、g=97。f 在每一个 n 上都比 g 大四倍有余,凭什么说 g 是 f 的"上界"?更过分的是 g(1)=−2、g(2)=−1、g(3)=0——在 n ≤ 3 这段,g 连正数都不是(定义里 ℝ⁺ 的要求都没满足,这正是 n₀ 要出场清理的烂摊子,和上一课 n²−100 的"负数区"一模一样)。

但你已经知道答案了 Big-O 比的从来不是逐点大小,而是增长率。f 和 g 都是斜率为常数的直线——同档。逐点差的那"四倍有余",恰好就是常数 c 的饭碗:c 可以把 g 整体撑大,撑到罩住 f 为止。亲眼看一下:
互动 · 看 c 把紫线"撑"过蓝线

蓝线 f(n)=3n+5,紫虚线 c·(n−3)。切换 c,看紫线从"永远垫底"到"越过蓝线"的瞬间:

选 c: c = 1 c = 4 c = 10
f(n)=3n+5c·(n−3)

好,直觉上能成。但证明需要白纸黑字。目标不等式是 3n+5 ≤ c(n−3)——把它当成普通的不等式来解,看看 c 和 n 各要满足什么:

3n + 5 ≤ c(n − 3) = cn − 3c
把含 n 的挪右边、常数挪左边:
5 + 3c ≤ cn − 3n = (c − 3)·n
第一个发现:c 有底线 —— 必须 c > 3 左边 5+3c 永远是正数,而右边是 (c−3)·n。若 c ≤ 3,右边要么恒为零要么是负的、根本不随 n 增长,不等式对再大的 n 都不可能成立。为什么底线恰好是 3?因为 f 的斜率是 3、g 的斜率是 1——c 至少要补齐这个斜率差,紫线才能追上蓝线。注意:这个 3 来自 f 的系数,不是 g 里那个 −3,别看串了。

c > 3 只是"有资格竞争";具体挑哪个 c、配哪个 n₀,下一节揭晓。

03

例一(定证书):先打草稿,再写证明 / Pick c, solve for n₀

既然 c > 3 都行,那就挑个顺手的。讲义选了 c = 4——代回去,n 的门槛自己浮出来。

取 c = 4: 5 + 3·4 ≤ (4−3)·n ⟺ 17 ≤ n → 挑 n₀ = 17

到这一步,草稿完成:证书是 (c, n₀) = (4, 17)。但草稿是"反着解"出来的,正式证明要"正着写"——从 f(n) 出发,一路 ≤ 下去,落到 c·g(n)。讲义的链条只有一行,却有一步神来之笔。一步步长出来:

互动 · 证明链生长机(c=4, n₀=17)
这一步在干嘛?点"下一步",从 f(n) 本尊出发。
合上草稿,看规范的书面证明 · Write-up
命题 3n + 5 = O(n − 3)。
c = 4,n₀ = 17。
验证 对任意 n ≥ 17:f(n) = 3n + 5 ≤ 3n + 5 + (n − 17) = 4n − 12 = 4(n − 3) = c·g(n)。
结论 存在 c = 4, n₀ = 17 满足定义,故 3n + 5 = O(n − 3)。∎

讲义还顺手给了第二张证书:挑 c = 5,门槛变成 5 + 15 ≤ 2n,即 n ≥ 10——证书 (5, 10) 同样有效:

证书 ①(讲义主线)
c = 4,n₀ = 17

c 抠门一点,就得多等几步——n₀ 被迫推到 17。验证链:3n+5 ≤ 3n+5+(n−17) = 4(n−3)。

证书 ②(讲义备选)
c = 5,n₀ = 10

c 大方一点,门槛立刻提前:3n+5 ≤ 3n+5+2(n−10) = 5n−15 = 5(n−3),对 n ≥ 10 成立。

重要观念:证书不唯一,答案没有"标准的那一个" (4,17) 和 (5,10) 都对,(100, 4) 其实也对。考试里你和同学写出不同的 (c, n₀) 可能都是满分——只要各自配套的验证成立。Big-O 证明是"存在性"游戏:交出一张有效证书即可,不比谁的证书漂亮
04

例一(游乐场):c 和 n₀ 的跷跷板 / The c–n₀ trade-off

两张证书摆在一起,规律已经露头:c 越大,n₀ 可以越小。这不是巧合,是一条能精确算出来的曲线。

刚才解出的门槛是 n ≥ (5+3c)/(c−3)。也就是说,每个 c > 3 都自带一个"最小可行 n₀"。拖动滑杆,找出整条跷跷板:

互动 · 证书游乐场:f = 3n+5,g = n−3

蓝线 f(n)=3n+5,紫虚线 c·(n−3),阴影区是 n ≥ n₀。目标:让紫线在阴影区里全程压住蓝线。

c =4
n0 =1

跷跷板全景:每个 c 的最小 n₀ (点击行,直接装载这张证书)

c门槛 (5+3c)/(c−3)最小可行 n₀
3—(除以 0)无解 ✗
417 / 1 = 1717
520 / 2 = 1010
623 / 3 ≈ 7.78
1035 / 7 = 55
1756 / 14 = 44
10003005 / 997 ≈ 3.014(还是 4!)
↑ 注意最后一行:c 加到一千,n₀ 也压不到 4 以下。因为 g(3)=0、g(2)=−1、g(1)=−2——在 n ≤ 3 处右边 c·g(n) ≤ 0,而左边永远是正数,多大的 c 都无力回天。负数区只能靠 n₀ 跳过,谁也替不了谁——上一课"c 吃倍数、n₀ 跳小 n"的分工,在这张表里看得清清楚楚。
这张跷跷板告诉你什么? (c, n₀) 的可行组合是一整片区域,边界是一条双曲线:c 往 3 靠,n₀ 飙上天;c 放开手,n₀ 缩到 4 就到底。做题时你只需要落在区域里的任何一点——所以尽管挑让验证最好写的那组,别追求"最小"。
05

例二:指数上的 +1 / 2ⁿ⁺¹ = O(2ⁿ)

f(n) = 2n+1,g(n) = 2n。上一课的陷阱言犹在耳:"指数的底数不能丢,O(2ⁿ) ≠ O(3ⁿ)"。那指数上加个 1 呢?是"大一点"还是"大一档"?

一行代数就见分晓。指数法则:2n+1 = 2 · 2n——指数上的 +1,拆下来只是乘 2。目标不等式立刻变得毫无悬念:

2n+1 ≤ c · 2n ⟺ 2 · 2n ≤ c · 2n ⟺ 2 ≤ c

不等式里的 n 直接消失了——对 n 没有任何要求,所以 n₀ 随便选,取最小的 n₀ = 1 即可。这是三个例子里唯一一个"n₀ 完全不用干活"的。

书面证明 · Write-up
命题 2n+1 = O(2n)。
c = 2,n₀ = 1。
验证 对任意 n ≥ 1:f(n) = 2n+1 = 2 · 2n ≤ 2 · 2n = c·g(n)。
结论 存在 c = 2, n₀ = 1 满足定义,故 2n+1 = O(2n)。∎

真正值钱的是把这个例子推而广之:指数上动手脚,什么动作是无害的、什么动作是致命的?点下面每个函数,看它能不能塞进 O(2ⁿ):

互动 · 指数改装厂:谁还留在 O(2ⁿ) 里?
2ⁿ⁺¹ 2ⁿ⁺¹⁰ 3·2ⁿ 2²ⁿ 3ⁿ
规律:指数上加常数 = 整体乘常数(c 吃得下,同档);指数上乘常数 = 换底数(c 吃不下,跨档)。加法在指数上是温柔的,乘法是致命的。
和上一课的陷阱对上号 L03 说"O(2ⁿ) ≠ O(3ⁿ)",本课说"2ⁿ⁺¹ = O(2ⁿ)"。两句话拼起来才是完整的地图:2ⁿ⁺¹、1024·2ⁿ 这类"常数倍"都在 2ⁿ 档内;而 3ⁿ、4ⁿ = 2²ⁿ 这类"换底"都在档外。判断标准永远是同一个:比值 f(n)/g(n) 是有界常数,还是随 n 冲向无穷?
06

例三:放缩的艺术 / (n+10)³ = O(n³)

f(n) = (n+10)³,g(n) = n³。目标:(n+10)³ ≤ c·n³。这次不解不等式了——展开三次方太脏。讲义用了一记更漂亮的手法。

机关:把碍事的小零件"放大"成主项 括号里的 +10 是唯一的麻烦。注意到只要 n ≥ 1,就有 10 ≤ 10n——把常数 10 故意放大成 10n,括号里就只剩 n 的倍数,三次方随手就开:
n ≥ 1 ⇒ 10 ≤ 10n ⇒ n + 10 ≤ n + 10n = 11n
两边同取立方(正数上立方保序): (n+10)³ ≤ (11n)³ = 11³ · n³ = 1331 · n³

证书到手:(c, n₀) = (1331, 1)。c 大得吓人?无所谓——定义只要"存在常数",1331 和 2 一样都是常数。这就是"放缩" bounding 的精神:不求紧,只求快、只求对

当然,讲义也演示了跷跷板的另一头:先把 n₀ 抬到 10,小零件就能放缩得更凶——此时 10 ≤ n,于是 n + 10 ≤ n + n = 2n,立方得 (n+10)³ ≤ 8n³:

证书 ①:n₀ 躺平,c 买单
c = 1331,n₀ = 1

用 10 ≤ 10n(对所有 n ≥ 1 成立)。门槛最低,常数最丑。

证书 ②:n₀ 抬高,c 骤降
c = 8,n₀ = 10

用 10 ≤ n(要求 n ≥ 10)。多等九步,常数从 1331 掉到 8——跷跷板再次现身。

书面证明(证书①) · Write-up
命题 (n+10)³ = O(n³)。
c = 1331,n₀ = 1。
验证 对任意 n ≥ 1:10 ≤ 10n,故 n+10 ≤ 11n;正数上立方保序,故 (n+10)³ ≤ (11n)³ = 1331·n³ = c·g(n)。
结论 存在 c = 1331, n₀ = 1 满足定义,故 (n+10)³ = O(n³)。∎
例三的普适结论:平移不改档 同样的手法对任何多项式都好使:(n+k)d = O(nd)——输入平移一个常数,增长档次纹丝不动。以后见到 (n+5)²、(n−7)⁴ 这类式子,心里直接把平移抹掉。(反过来想也通:平移只是"把曲线横着挪一挪",而增长率看的是无穷远处的尾巴,尾巴挪十步还是那条尾巴。)
07

Big-O 读作"≤" / Big-O describes upper bounds

三场胜仗打完,讲义停下来把"语感"钉死。f(n) = O(g(n)) 这行符号,你应该在脑子里自动翻译成三句话:

  • 渐近地 (asymptotically),f 的增长不快于 (no faster than) g;
  • 按增长率排序的话,f(n) ≤ g(n);
  • g 是 f 的一个上界 upper bound
一个好用的心智替换 看到 f = O(g),眼里自动替换成 f ⪯ g(增长率意义上的 ≤)。回头看三个例子全都通:3n+5 ⪯ n−3(同为线性档,成立)、2ⁿ⁺¹ ⪯ 2ⁿ(同为 2ⁿ 档,成立)、(n+10)³ ⪯ n³(同为三次档,成立)。再复习一遍 L03 的提醒:这里的"="是记号滥用,真身是集合成员 f ∈ O(g);既然 O 只是 ≤,它当然不承诺紧——3n+5 = O(n²) 照样为真,只是没什么用。

既然 O 是"≤",一个自然的问题立刻冒出来:如果 f 的增长率真的比 g 高,会发生什么?讲义的原话(标红的那句):

讲义原文 · The red line "On the other hand, if f grows faster than g, then no matter how large c and n₀ are, f(n) will eventually exceed g(n)." —— 如果 f 增长得比 g 快,那么无论 c 和 n₀ 取多大,f(n) 终将反超。不是"证书难找",是"证书不存在"。

这句话给了我们全新的武器:证明"不是 O"。方向一掉头,量词全体翻转——下一节,课程里第一次反证。

08

第一次反证:0.01n² ≠ O(n) / Proving a negative

f(n) = 0.01n²,g(n) = n。系数 0.01 小得可怜——但你已经被这节课训练过了:系数救不了增长率。二次就是二次。

先想清楚"要证的到底是什么"。证 O 时,定义是"存在 c、存在 n₀":你交一张证书就赢。反证 O 是把整句话否定——"存在"翻转成"任意":

Negation · f ≠ O(g) 的含义
对任意 c > 0 和任意 n0,
都存在某个 n ≥ n0,使得 f(n) > c · g(n)

角色对调了:证 O 时你挑常数、全世界的 n 来检验;反证 O 时别人随便给常数,你负责造出一个翻车的 n。所以反证的核心是一台"反例生成器":输入任意 c,输出一个必然翻车的 n。对本题,生成器一行就写出来了:

想要 0.01n² > c·n ⟺ 0.01n > c ⟺ n > 100c

就这么直白:只要 n 超过 100c,不等式必翻。讲义的验证(注意每一步都是严格的):

若 n > 100c: f(n) = 0.01n² = 0.01·n·n > 0.01·(100c)·n = c·n = c·g(n)
书面反证 · Write-up
命题 0.01n² ≠ O(n)。
任给 c > 0 与 n₀ ∈ ℕ(对手随便挑)。
构造 取 n* = max(n₀, ⌊100c⌋ + 1)。则 n* ≥ n₀ 且 n* > 100c。
验证 f(n*) = 0.01·n*·n* > 0.01·(100c)·n* = c·n* = c·g(n*)。
结论 任何 (c, n₀) 都存在反例点 n*,定义无法满足,故 0.01n² ≠ O(n)。∎
品一品这两个方向的不对称 证 O:交一张证书就收工。反证 O:必须对所有证书统统给出反例——所以反例 n 必须写成 c 的函数(这里是 n > 100c),而不是一个具体数字。"我试了 n=1000 它翻车了"证明不了任何事:人家换个更大的 c 就把 n=1000 罩回去了。能一网打尽所有 c 的,只有公式,不是数字。
09

量词对抗赛:你出证书,对手找反例 / The adversary game

把两个方向做成一个游戏,亲手感受"真命题打得赢、假命题必输"。你扮演证明者:挑一对 (c, n₀) 递交;机器扮演对手 (adversary):专职在 n ≥ n₀ 里找翻车点。

互动 · 递交你的证书
选命题: 命题 A:3n+5 = O(n−3) 命题 B:0.01n² = O(n)
c =10
n0 =1
屡战屡败之后,点开:看穿对手的底牌 · Spoiler
命题 A 是真命题。对手的检验只是解不等式:你的证书有效 ⟺ c > 3 且 n₀ ≥ (5+3c)/(c−3)。落在 §04 跷跷板区域里,对手只能认输。
命题 B 是假命题。对手的必杀技是一条公式:n* = max(n₀, ⌊100c⌋+1)。你给 c=200?它拿 n=20001 砸你:0.01·20001² ≈ 4,000,400 > 200·20001 = 4,000,200。你永远差那么一点——这不是运气,是 §08 的定理在替它撑腰。
寓意 证 O 是"存在"游戏:真命题总有一手好牌。反证 O 是"任意"游戏:假命题下,对手的反例生成器一次都不会失手。
10

配方 2.0 + 新陷阱 / Recipes & pitfalls

上一课的配方只有"挑 c → 挑 n₀ → 验证"三步。打完这四仗,配方升级,反证也有了自己的流水线。

证明配方 2.0 · Proving f = O(g)

解不等式,摸清 c 的底线

把 f ≤ c·g 整理成 "(…)·n ≥ 常数" 的形状,看 c 多大才能让 n 的系数为正。(例一:c > 3,底线来自两边斜率之比)

挑定 c,反解出 n₀

代入顺手的 c,n 的门槛自动浮现。(c=4 → n₀=17;c=5 → n₀=10——跷跷板上任选一点)

嫌解不等式脏?直接放缩

用 n ≥ 1 或 n ≥ n₀ 把小零件放大成主项:10 ≤ 10n、100n ≤ n²(n≥100)……不求紧,只求对。(例三:c=1331 丑吗?丑。有效吗?有效。)

正着写成链条

草稿是反着解的,证明要正着写:f(n) ≤ … ≤ c·g(n),每个 ≤ 标明理由,最后 ∎。("凭空加 (n−17)"这类妙步全都来自草稿。)

反证配方 · Disproving f = O(g)

站到对手视角

假想别人递来任意的 c 和 n₀——你一个都不能放过。

造反例生成器

解 f(n) > c·g(n),把反例区写成 c 的函数。(0.01n² > cn ⟺ n > 100c)

说明反例总存在

取 n* = max(n₀, …)+1 之类,写清严格不等式,∎。(n 无上界,所以"够大的 n"永远取得到。)

本课新增的四个坑 · Pitfalls

逐点大小 ≠ 增长率大小
"3n+5 每点都 > n−3,所以不可能 O(n−3)" ✗

Big-O 从不比逐点大小——c 可以把 g 整体撑大。同档直线之间互为 O,哪怕一条永远压着另一条。

(c, n₀) 是绑定的一对
c 抄一题、n₀ 抄另一题 ✗

换了 c,门槛就变:(4,17) 有效、(5,10) 有效,但 (4,10) 无效——n=10 时 35 > 28。证书必须整对验证。

试数字不是证明,单点也不是反证
"n=10⁶ 时成立,证毕" ✗

证 O 要求"从 n₀ 起全体 n";反证 O 要求"打赢全体 (c, n₀)"——反例必须是 c 的公式(n > 100c),孤零零一个数字谁也打不死。

指数上:加法温柔,乘法致命
"2²ⁿ 和 2ⁿ⁺¹ 一样,都差常数" ✗

2ⁿ⁺¹ = 2·2ⁿ 同档;2²ⁿ = 4ⁿ 换了底数,比值 2ⁿ → ∞,跨档。指数上"+k"是乘 2ᵏ,"×k"是换底 (2ᵏ)ⁿ。

11

挑战题:动笔,再看解 / Harder problems

四道加练,难度递增,全部只用本课武器(定义 + 反解 + 放缩 + 反例生成器)。先在纸上写出自己的 (c, n₀) 或反例公式,再点开题解对答案——直接看解等于没做。

★★ · 综合例一 + 例三
C1. 证明:5n² + 100n = O(n² − 50n)。

提示:g 有负数区(n ≤ 50),先想 n₀ 至少要多大;再用"n ≥ 某数时 100n ≤ n²、50n ≤ n²/2"两次放缩。

题解 · Solution
c = 12,n₀ = 100。
放缩上界 n ≥ 100 ⇒ 100n ≤ n·n = n²,故 f(n) = 5n² + 100n ≤ 6n²。
放缩下界 n ≥ 100 ⇒ 50n ≤ n²/2,故 g(n) = n² − 50n ≥ n²/2。
拼装 f(n) ≤ 6n² = 12·(n²/2) ≤ 12·(n² − 50n) = c·g(n),对所有 n ≥ 100 成立。∎
复盘 两头放缩是搭桥:f 放大到 6n²,g 缩小到 n²/2,中间用干净的 n² 接上。比硬解 5n²+100n ≤ c(n²−50n) 的二次不等式省事得多。你的 (c, n₀) 和这里不同?套定义验证一遍,有效就同样满分。
★★ · 模仿 §08 的量词结构
C2. 证明:4ⁿ ≠ O(2ⁿ)。

提示:先把比值 4ⁿ/2ⁿ 化简,再造反例生成器 n(c)。

题解 · Solution
任给 c > 0 与 n₀。
化简 4ⁿ = (2·2)ⁿ = 2ⁿ·2ⁿ。所以 4ⁿ > c·2ⁿ ⟺ 2ⁿ > c ⟺ n > log₂c。
构造 取 n* = max(n₀, ⌊log₂c⌋ + 1)。则 n* ≥ n₀ 且 2^{n*} > c。
验证 f(n*) = 4^{n*} = 2^{n*}·2^{n*} > c·2^{n*} = c·g(n*)。∎
复盘 和 0.01n² ≠ O(n) 一模一样的骨架,连"反例区是 c 的函数"都对应:那边 n > 100c,这边 n > log₂c。§05 说"2²ⁿ 跨档"——现在它有了严格证明。
★★★ · 例三的第二条路
C3. 用二项式展开重新证明 (n+10)³ = O(n³),并解释:为什么这条路得到的 c 和放缩那条路一样,都是 1331?

提示:(n+10)³ = n³ + 30n² + 300n + 1000,然后对每个低次项各放缩一次(n ≥ 1)。系数们加起来是多少?

题解 · Solution
展开 (n+10)³ = n³ + 30n² + 300n + 1000。
逐项放缩 n ≥ 1 时:30n² ≤ 30n³,300n ≤ 300n³,1000 ≤ 1000n³。
求和 (n+10)³ ≤ (1 + 30 + 300 + 1000)·n³ = 1331·n³。取 c = 1331, n₀ = 1。∎
为什么又是 1331? 不是巧合:1 + 30 + 300 + 1000 恰是二项式系数写法下的 (1+10)³ —— 把展开式里所有 n 的幂都换成 n³(即令"n=1 的那部分权重"整体归到 n³ 上),得到的总系数正是把 n+10 里的 n 用 1 顶替后的 (1+10)³ = 11³。两条路殊途同归,因为它们做的是同一次放缩:n + 10 ≤ 11n ⟺ 逐项把低次幂抬成 n³
推广 同样的算法对 (n+k)^d 给出 c = (1+k)^d, n₀ = 1——"平移不改档"的通用证书。
★★★★ · 多项式 vs 指数(超出讲义,经典必会)
C4. 证明:n³ = O(2ⁿ)。

提示:反解不等式解不动(n³ ≤ c·2ⁿ 没有初等解),放缩也不好直接放。试试数学归纳法:先找一个 n₀ 使 n₀³ ≤ 2^{n₀},再证"每往前走一步,右边翻倍,而左边翻不到倍"。关键比值:(n+1)³/n³ = (1 + 1/n)³。

题解 · Solution
c = 1,n₀ = 10。断言:对所有 n ≥ 10,n³ ≤ 2ⁿ。
奠基 n = 10:10³ = 1000 ≤ 1024 = 2¹⁰。✓(差点就不够——所以 n₀ 挑 10 正合适;n=9 时 729 > 512,确实翻车。)
归纳 设 n ≥ 10 且 n³ ≤ 2ⁿ。则 (n+1)³ = n³·(1 + 1/n)³ ≤ n³·(1.1)³ = 1.331·n³ < 2·n³ ≤ 2·2ⁿ = 2ⁿ⁺¹。✓
结论 由归纳法,n ≥ 10 时 n³ ≤ 2ⁿ,故存在 c=1, n₀=10,n³ = O(2ⁿ)。∎
复盘 归纳步的灵魂:指数每步稳定 ×2,多项式每步只能 ×(1+1/n)³ ≈ 1.33(且越走越接近 1)。这一句话就是"任何多项式最终都输给任何指数"的机理——n₀ 的作用则是熬过多项式前期的疯长(n 从 1 到 9 时 (1+1/n)³ 一度高达 8)。这个结论下学期讲排序下界、指数爆炸时会反复用到。
12

随堂小测 / Quick Check

无限次尝试,零压力。七道题,专打这节课的要害。

Q1. f(n) = 3n+5 在每一个 n 上都大于 g(n) = n−3,为什么还能有 f = O(g)?
Q2. 例一中为什么必须 c > 3?
Q3. 例一里 c=4 配 n₀=17、c=5 配 n₀=10 都能证成。这说明什么?
Q4. 下列哪个函数属于 O(2ⁿ)?
Q5. 例三里"(n+10)³ ≤ (11n)³"这步放缩,完整的依据是?
Q6. 要证明 f ≠ O(g),正确的姿势是?
Q7. 反证 0.01n² ≠ O(n) 时,对手拿到 c 之后,翻车点是哪些 n?