相关笔记: 3.1 算法 | 3.3 算法复杂度分析
概览
本节系统介绍了用于描述函数增长的渐近记号体系,包括大O记号(Big-O)、==大记号(Big-Omega)和大记号(Big-Theta)==。这些记号是分析算法效率的数学基础,使我们能够在忽略常数因子和低阶项的前提下,比较不同函数的增长速率。
- 大O记号 表示 的增长不超过 的某个常数倍,提供上界
- ==大记号== 表示 的增长不低于 的某个常数倍,提供下界
- ==大记号== 表示 与 同阶增长,同时提供上界和下界
- 重要增长阶排序:
- 多项式 的阶由最高次项决定:
- 大O记号具有对和与积的封闭性,可用于组合函数的增长估计
一、知识结构总览
graph TB A["3.2 函数的增长 The Growth of Functions"] --> B["大O记号 Big-O"] A --> C["大Ω记号 Big-Omega"] A --> D["大Θ记号 Big-Theta"] A --> E["重要函数的增长阶"] A --> F["函数组合的增长估计"] A --> G["Little-o 记号"] B --> B1["定义:|f(x)| ≤ C|g(x)|"] B --> B2["证人 Witnesses C, k"] B --> B3["多项式估计:O(x^n)"] B --> B4["对数与指数估计"] C --> C1["定义:|f(x)| ≥ C|g(x)|"] C --> C2["与 Big-O 的对偶关系"] C --> C3["提供增长下界"] D --> D1["定义:同时 O 和 Ω"] D --> D2["同阶增长 Same Order"] D --> D3["多项式的阶 = 最高次项"] E --> E1["1 < log n < n < n log n"] E --> E2["n² < n³ < 2ⁿ < n!"] E --> E3["对数幂 < 多项式幂 < 指数"] E --> E4["实际运行时间对比表"] F --> F1["和的估计 Theorem 2"] F --> F2["积的估计 Theorem 3"] F --> F3["推论:同 g 的和仍为 O(g)"] G --> G1["定义:lim f(x)/g(x) = 0"] G --> G2["严格小于的渐近关系"]
二、核心思想
核心思想
本节的核心思想是渐近分析(asymptotic analysis):通过大O、大、大三种渐近记号,在忽略常数因子和低阶项的前提下,用简洁的数学语言描述函数的增长速率。这为算法复杂度的比较提供了统一的理论框架——我们不再关注算法在特定输入下的精确运行时间,而是关注当输入规模趋于无穷时,运行时间的增长趋势属于哪个”阶”。
1. 大O记号(Big-O Notation)
大O记号(Big-O Notation)
设 和 是从整数集或实数集到实数集的函数。若存在常数 和 使得
则称 是 ,读作” 是大O的 ”。
- 常数 和 称为该关系的证人(witnesses)
- 直觉含义: 的增长速度不超过 的某个常数倍
- 若 且 ( 足够大时),则
证明 是
当 时, 且 ,因此:
取 , 作为证人即可。
也可以取 ,(当 时,,)。
证明 不是
反证法:假设存在 和 使得 对所有 成立。
两边除以 得 ,但无论 取何值, 都可以大于 ,矛盾。
多项式的大O估计(Theorem 1)
设 ,则 。
证明:当 时,利用三角不等式:
取 , 即可。
2. 大记号(Big-Omega Notation)
大 记号(Big-Omega Notation)
设 和 是从整数集或实数集到实数集的函数。若存在正常数 和 使得
则称 是 ,读作” 是大Omega的 ”。
- 大 提供函数增长的下界
- 关键对偶关系: 当且仅当
是
因为 对所有正实数 成立,取 ,。
3. 大记号(Big-Theta Notation)
大 记号(Big-Theta Notation)
当且仅当 且 。
等价定义:存在正常数 、 和 使得
- 表示两个函数同阶增长(same order)
- 当且仅当 且
证明 是
上界:,故 。
下界:只保留大于 的项:
故 ,因此 。
多项式的阶(Theorem 4)
设 ,其中 ,则 。
即多项式的阶完全由其最高次项决定。
4. 重要函数的增长阶比较
常见增长函数的阶
以下函数按增长速度从慢到快排列:
更一般地:
- 若 ,则 ,但
- 若 ,,则 ,但
- 若 ,则 ,但
- 若 ,则 ,但
阶乘与对数阶乘的估计
- ,故
- ,故
- (正整数),故 ,
5. 函数组合的增长估计
和的大O估计(Theorem 2)
若 且 ,则 。
推论(Corollary 1):若 和 都是 ,则 。
积的大O估计(Theorem 3)
若 且 ,则 。
估计
- ,,由 Theorem 3:
- ,,由 Theorem 3:
- 由 Corollary 1:
6. Little-o 记号
Little-o 记号
(读作” 是 little-o 的 “)当且仅当
- Little-o 表示 的增长严格小于
- 蕴含 ,但反之不成立
- 例如:,,但
三、补充理解与易混淆点
补充理解
补充1:为什么大O记号忽略常数因子
大O记号由德国数学家 Paul Bachmann 于 1894 年在其解析数论著作中首次引入(Bachmann, 1894),后经 Edmund Landau(Landau, 1909)在解析数论研究中广泛推广使用,因此也被称为”Bachmann-Landau 记号”。Donald Knuth 在 1976 年的论文中进一步规范了 、、 三种记号的定义与用法(Knuth, 1976)。
忽略常数因子的核心原因在于:当 足够大时,常数因子的影响被增长阶完全主导。例如 最终会超过 ——无论常数因子相差多大,高阶函数终将胜出。在实际意义层面,不同编程语言或硬件平台之间的常数因子差异可达 10-100 倍(解释型语言 vs 编译型语言、不同 CPU 微架构等),但这些差异无法改变算法的渐近阶。正如《算法导论》(CLRS, Cormen et al., 2009, Ch.3)所强调的:大O记号刻画的是”增长率的上界”,而非精确运行时间,它使我们在不依赖具体硬件和实现细节的前提下比较算法的内在效率。
- Big O Complexity Visualizer — 大O复杂度交互式可视化,对比不同增长阶的运行时间
- Big O Notation Tutorial — 大O记号完整教程 来源:Knuth, D. E. (1976). “Big Omicron and Big Omega and Big Theta.” ACM SIGACT News, 8(2), 18–24. 来源:Cormen, T. H., et al. (2009). Introduction to Algorithms (3rd ed.), MIT Press, Chapter 3, Section 3.1.
补充2:增长阶的实际意义——当 足够大时
不同增长阶的函数在 较小时可能差异不大,但当 增大时差异极其惊人。Sedgewick & Wayne(2011)给出了实用的经验法则: 时所有算法都足够快; 时 可接受; 时 开始吃力; 时需要 或更优的算法。
以下是基于单核 CPU(约 次基本操作/秒)的实际运行时间参考:
复杂度 ms s s ms s s s 天 年 不可行 不可行 不可行 这说明算法复杂度的选择直接决定了问题是否可解。此外,空间换时间也是常见的策略:哈希表用 的额外空间实现 的平均查找时间,在很多场景下是值得的权衡。
- DSA Visualizer — 实时显示算法性能随输入规模的变化
- Big O Complexity Visualizer — 增长阶对比可视化 来源:Cormen, T. H., et al. (2009). Introduction to Algorithms (3rd ed.), MIT Press, Chapter 3. 来源:Sipser, M. (2012). Introduction to the Theory of Computation (3rd ed.), Cengage Learning, Chapter 7.
易混淆点
误区:大O与大 与大的区别
- ❌ 认为 意味着 和 增长速度差不多
- ✅ 三种记号提供不同精度的信息:
- : 增长不超过 的常数倍(上界)
- : 增长不低于 的常数倍(下界)
- : 与 同阶增长(上界 + 下界)
- ❌ 混淆 和 ,例如说” 是 所以它和 差不多”
- ✅ 只说明 不超过 的常数倍(这当然成立),但 的精确阶是 ,而非
- ⚠️ Knuth 指出,许多作者粗心地用 代替 。当需要同时表达上界和下界时,应使用
误区: 与 的实际差距
- ❌ 认为 和 差别不大,因为 增长很慢
- ✅ 当 时:
- 差距达 5 万倍
- 当 时,差距超过 3 亿倍
这就是为什么归并排序()在实际应用中远优于冒泡排序()。即使 算法的常数因子更大,只要 足够大,它一定会胜出。
四、习题精选
习题概览
题号范围 核心考点 难度 1-2 判断函数是否为 / ,找证人 ⭐ 3-6 用定义证明大O关系 ⭐⭐ 7-8 求最小整数 使 ⭐⭐ 9-14 证明大O关系不成立(反证法) ⭐⭐⭐ 15-18 的含义、传递性、幂和 ⭐⭐ 19-20 指数函数与对数函数的大O关系 ⭐⭐ 21-22 将多个函数按增长阶排列 ⭐⭐⭐ 23-24 比较两个算法的操作数 ⭐⭐ 25-27 复杂函数的大O估计(和、积、组合) ⭐⭐⭐ 28-29 判断 和 关系 ⭐⭐ 30-34 证明 关系(等价条件) ⭐⭐⭐ 35-37 、 的含义 ⭐⭐ 38-39 阶乘与幂的大O估计 ⭐⭐⭐ 40-42 对数底变换、复合函数 ⭐⭐⭐ 43-50 的运算性质(和、积、商) ⭐⭐⭐⭐ 51-56 多变量大O// ⭐⭐⭐ 57-62 微积分证明(需 L’Hopital 法则) ⭐⭐⭐⭐ 63-77 Little-o 记号与渐近关系 ⭐⭐⭐⭐
题1:用定义证明大O关系
题目
证明 是 ,并找出证人 和 。
解答
当 时:
- ,,
- 因此
取 , 作为证人即可。
更优的证人:当 时,,,,因此:
取 ,。
题2:证明大O关系不成立
题目
证明 不是 。
解答
反证法:假设存在 和 使得 对所有 成立。
两边除以 ()得 。
但无论 取何值,总可以取 ,此时 ,矛盾。
因此 不是 。
题3:判断大O关系并找证人
题目
判断 是否为 。如果是,找出证人 和 。
解答
当 时:,
取 ,。
题4:证明 Θ 关系
题目
证明 是 。
解答
证 :当 时,,,故 ,取 ,。
证 :当 时,,,故 ,取 ,。
由 和 同时成立,得 。
题5:利用 L’Hôpital 法则证明 Little-o 关系
题目
证明 是 ,即证明 。
解答
由 L’Hôpital 法则( 型):
因此 。
解题思路提示
大O// 证明的解题方法论:
- 证明 关系:利用不等式放缩,将 放大到 的形式,关键是找到合适的证人 和
- 证明 关系不成立:使用反证法,假设关系成立后推出矛盾(通常是 可以无限增大而超过常数 )
- 证明 关系:分别证明 和 关系,即同时找到上界和下界的证人
- 多项式估计:最高次项决定阶,其余项通过放缩被吸收进最高次项的常数因子中
- 利用已知定理:多项式的阶(Theorem 1/4)、和的估计(Theorem 2)、积的估计(Theorem 3)可以直接引用
五、视频学习指南
视频资源
六、教材原文
教材原文
“Big-O notation is used extensively to estimate the number of operations an algorithm uses as its input grows. With the help of this notation, we can determine whether it is practical to use a particular algorithm to solve a problem as the size of the input increases.”
“The German mathematician Paul Bachmann first introduced big-O notation in 1892 in an important book on number theory. The big-O symbol is sometimes called a Landau symbol after the German mathematician Edmund Landau. The use of big-O notation in computer science was popularized by Donald Knuth, who also introduced the big- and big- notations.”