Article

算法导论-CH3-描述运行时间

本章研究当输入规模 $n$ 增大时,算法运行时间的主要变化趋势。我们使用渐近记号来简化对算法性能的描述,忽略掉不重要的常数项和低次项。

May 7, 2026 修考 7 min read

第三章:描述运行时间(函数的增长)

本章研究当输入规模 nn 增大时,算法运行时间的主要变化趋势。我们使用渐近记号来简化对算法性能的描述,忽略掉不重要的常数项和低次项。

一、 渐近记号 (Asymptotic Notation)

1. OO 记号:渐近上界 (Upper Bound)

  • 描述OO 记号给出了函数的一个上界(最坏情况的保障)。
  • 直观理解:等价于数学中的“小于等于”关系 (\le)。它表示函数 f(n)f(n) 的增长阶不会超过 g(n)g(n) 的常数倍。
  • 例题: 若 T(n)=7n3+100n220n+6T(n) = 7n^3 + 100n^2 - 20n + 6
    • 则我们可以说 T(n)=O(n3)T(n) = O(n^3)。 同时也满足 T(n)=O(nc)T(n) = O(n^c),其中 c3c \ge 3(如 O(n4)O(n^4) 也成立,但通常取最紧的阶)。

2. Ω\Omega 记号:渐近下界 (Lower Bound)

  • 描述Ω\Omega 记号给出了函数的一个下界(最好情况的保障)。
  • 直观理解:等价于数学中的“大于等于”关系 (\ge)。它表示函数 f(n)f(n) 的增长阶至少是 g(n)g(n) 的常数倍。
  • 例题: 若 T(n)=7n3+100n220n+6T(n) = 7n^3 + 100n^2 - 20n + 6
    • 则我们可以说 T(n)=Ω(n3)T(n) = \Omega(n^3)。 同时也满足 T(n)=Ω(nc)T(n) = \Omega(n^c),其中 c3c \le 3(如 Ω(n2)\Omega(n^2)Ω(1)\Omega(1) 也成立)。

3. Θ\Theta 记号:紧确界 (Tight Bound)

  • 描述:当一个函数既有相同阶的上界又有相同阶的下界时,我们称其为紧确界。
  • 直观理解:等价于数学中的“等于”关系 (==)。上界与下界中间夹着的,就是紧确界。
  • 性质f(n)=Θ(g(n))f(n) = \Theta(g(n)) 的前提是 f(n)f(n) 的阶与 g(n)g(n) 完全一致。

二、 渐近记号的数学定义

f(n)f(n)g(n)g(n) 是定义在非负整数集上的非负函数。

  1. OO 记号c>0,n0>0,使得 nn0,0f(n)cg(n)\exists c > 0, n_0 > 0, \text{使得 } \forall n \ge n_0, 0 \le f(n) \le cg(n)
  2. Ω\Omega 记号c>0,n0>0,使得 nn0,0cg(n)f(n)\exists c > 0, n_0 > 0, \text{使得 } \forall n \ge n_0, 0 \le cg(n) \le f(n)
  3. Θ\Theta 记号c1,c2>0,n0>0,使得 nn0,0c1g(n)f(n)c2g(n)\exists c_1, c_2 > 0, n_0 > 0, \text{使得 } \forall n \ge n_0, 0 \le c_1g(n) \le f(n) \le c_2g(n)

三、 重要定理与极限关系

定理 3.1

对于任意两个函数 f(n)f(n)g(n)g(n),有: 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))

极限角度理解(补充)

通过对比两个函数的阶,我们可以通过极限判断:

  • limnf(n)g(n)=0\lim_{n \to \infty} \frac{f(n)}{g(n)} = 0,则 f(n)=o(g(n))f(n) = o(g(n))(低阶)。
  • limnf(n)g(n)=C>0\lim_{n \to \infty} \frac{f(n)}{g(n)} = C > 0,则 f(n)=Θ(g(n))f(n) = \Theta(g(n))(同阶)。
  • limnf(n)g(n)=\lim_{n \to \infty} \frac{f(n)}{g(n)} = \infty,则 f(n)=ω(g(n))f(n) = \omega(g(n))(高阶)。

四、 排序算法的时间复杂度证明与分析

1. 插入排序 (Insertion Sort)

  • 最坏情况O(n2)O(n^2)。当数组完全倒序时,每一轮都需要移动大量元素。
    • 分析:共有 n1n-1 轮,第 ii 轮需要 i1i-1 次比较和交换,求和得:i=1n(i1)=n(n1)2=Θ(n2)\sum_{i=1}^{n} (i-1) = \frac{n(n-1)}{2} = \Theta(n^2)
  • 最好情况Ω(n)\Omega(n)。当数组已经有序时,只需进行 n1n-1 次比较。
  • Ω(n2)\Omega(n^2) 下界的证明思路(参考 Figure 3.1): 若前 n/3n/3 个位置包含数组中最大的 n/3n/3 个值,那么每一个值都必须跨过中间的 n/3n/3 个位置才能到达最终位置。总移动步数至少为 (n/3)×(n/3)=n2/9(n/3) \times (n/3) = n^2/9,因此是 Ω(n2)\Omega(n^2)

image-20260507153630614

2. 选择排序 (Selection Sort) —— 练习 3.1-2

选择排序无论在最好还是最坏情况下,时间复杂度均为 Θ(n2)\Theta(n^2)

  • 伪代码分析: 外层循环执行 n1n-1 次。 内层循环寻找剩余元素中的最小值,执行次数依次为 n1,n2,,1n-1, n-2, \dots, 1

  • 精确计算

    T(n)=i=1n1(i+c)=12n2+(c12)nc=Θ(n2)T(n) = \sum_{i=1}^{n-1} (i + c) = \frac{1}{2}n^2 + (c - \frac{1}{2})n - c = \Theta(n^2)

    其中 cc 为交换操作所需的常数时间。

3. 归并排序 (Merge Sort)

  • 归并排序在最好、平均、最坏情况下的时间复杂度均为 Θ(nlgn)\Theta(n \lg n)
    • 注:修正了原笔记中关于归并排序为 Θ(n2)\Theta(n^2) 的误写。

五、 图形化理解

image-20260507153714016