第三章:描述运行时间(函数的增长)
本章研究当输入规模 n 增大时,算法运行时间的主要变化趋势。我们使用渐近记号来简化对算法性能的描述,忽略掉不重要的常数项和低次项。
一、 渐近记号 (Asymptotic Notation)
1. O 记号:渐近上界 (Upper Bound)
- 描述:O 记号给出了函数的一个上界(最坏情况的保障)。
- 直观理解:等价于数学中的“小于等于”关系 (≤)。它表示函数 f(n) 的增长阶不会超过 g(n) 的常数倍。
- 例题: 若 T(n)=7n3+100n2−20n+6
- 则我们可以说 T(n)=O(n3)。 同时也满足 T(n)=O(nc),其中 c≥3(如 O(n4) 也成立,但通常取最紧的阶)。
2. Ω 记号:渐近下界 (Lower Bound)
- 描述:Ω 记号给出了函数的一个下界(最好情况的保障)。
- 直观理解:等价于数学中的“大于等于”关系 (≥)。它表示函数 f(n) 的增长阶至少是 g(n) 的常数倍。
- 例题: 若 T(n)=7n3+100n2−20n+6
- 则我们可以说 T(n)=Ω(n3)。 同时也满足 T(n)=Ω(nc),其中 c≤3(如 Ω(n2) 或 Ω(1) 也成立)。
3. Θ 记号:紧确界 (Tight Bound)
- 描述:当一个函数既有相同阶的上界又有相同阶的下界时,我们称其为紧确界。
- 直观理解:等价于数学中的“等于”关系 (=)。上界与下界中间夹着的,就是紧确界。
- 性质:f(n)=Θ(g(n)) 的前提是 f(n) 的阶与 g(n) 完全一致。
二、 渐近记号的数学定义
设 f(n) 和 g(n) 是定义在非负整数集上的非负函数。
- O 记号: ∃c>0,n0>0,使得 ∀n≥n0,0≤f(n)≤cg(n)
- Ω 记号: ∃c>0,n0>0,使得 ∀n≥n0,0≤cg(n)≤f(n)
- Θ 记号: ∃c1,c2>0,n0>0,使得 ∀n≥n0,0≤c1g(n)≤f(n)≤c2g(n)
三、 重要定理与极限关系
定理 3.1
对于任意两个函数 f(n) 和 g(n),有: f(n)=Θ(g(n)) 当且仅当 f(n)=O(g(n)) 且 f(n)=Ω(g(n))。
极限角度理解(补充)
通过对比两个函数的阶,我们可以通过极限判断:
- 若 limn→∞g(n)f(n)=0,则 f(n)=o(g(n))(低阶)。
- 若 limn→∞g(n)f(n)=C>0,则 f(n)=Θ(g(n))(同阶)。
- 若 limn→∞g(n)f(n)=∞,则 f(n)=ω(g(n))(高阶)。
四、 排序算法的时间复杂度证明与分析
1. 插入排序 (Insertion Sort)
- 最坏情况:O(n2)。当数组完全倒序时,每一轮都需要移动大量元素。
- 分析:共有 n−1 轮,第 i 轮需要 i−1 次比较和交换,求和得:∑i=1n(i−1)=2n(n−1)=Θ(n2)。
- 最好情况:Ω(n)。当数组已经有序时,只需进行 n−1 次比较。
- Ω(n2) 下界的证明思路(参考 Figure 3.1): 若前 n/3 个位置包含数组中最大的 n/3 个值,那么每一个值都必须跨过中间的 n/3 个位置才能到达最终位置。总移动步数至少为 (n/3)×(n/3)=n2/9,因此是 Ω(n2)。

2. 选择排序 (Selection Sort) —— 练习 3.1-2
选择排序无论在最好还是最坏情况下,时间复杂度均为 Θ(n2)。
-
伪代码分析: 外层循环执行 n−1 次。 内层循环寻找剩余元素中的最小值,执行次数依次为 n−1,n−2,…,1。
-
精确计算:
T(n)=∑i=1n−1(i+c)=21n2+(c−21)n−c=Θ(n2)
其中 c 为交换操作所需的常数时间。
3. 归并排序 (Merge Sort)
- 归并排序在最好、平均、最坏情况下的时间复杂度均为 Θ(nlgn)。
- 注:修正了原笔记中关于归并排序为 Θ(n2) 的误写。
五、 图形化理解
