相关笔记: 3.1 O记号、Ω记号与Θ记号 | 3.3 标准记号与常见函数

概览

本节对3.1 O记号、Ω记号与Θ记号中引入的五种渐近记号给出了严格的形式化定义,并系统阐述了它们的数学性质与相互关系。五种记号分别刻画了函数增长率的不同侧面:大 O 记号给出渐近上界、大 Ω 记号给出渐近下界、大 Θ 记号给出渐近紧确界、小 o 记号给出非紧确的严格上界、小 ω 记号给出非紧确的严格下界。本节还讨论了渐近记号在等式和不等式中的使用惯例、常见的”合理滥用”以及函数之间的渐近比较性质(传递性、自反性、对称性、转置对称性),并指出渐近记号与实数比较运算的类比关系及其局限性(三歧性不成立)。

  • O(g(n)) 形式化定义为集合 ,描述渐近上界
  • Ω(g(n)) 形式化定义为集合 ,描述渐近下界
  • Θ(g(n)) 形式化定义为集合 ,描述渐近紧确界
  • o(g(n)) 要求对任意 都存在 使得 ,是非紧确的严格上界
  • ω(g(n)) 要求对任意 都存在 使得 ,是非紧确的严格下界
  • 定理 3.1: 当且仅当
  • 渐近记号具有传递性、自反性、对称性和转置对称性,可类比实数的 运算
  • 渐近记号不满足三歧性:并非所有函数对都能进行渐近比较

知识结构总览

graph TB
    A["3.2 渐近记号的形式化定义"] --> B["五种渐近记号的形式化定义"]
    A --> C["渐近记号与运行时间"]
    A --> D["等式与不等式中的使用"]
    A --> E["合理滥用"]
    A --> F["函数比较性质"]

    B --> B1["O-notation 渐近上界"]
    B --> B2["Ω-notation 渐近下界"]
    B --> B3["Θ-notation 渐近紧确界"]
    B --> B4["o-notation 严格上界"]
    B --> B5["ω-notation 严格下界"]

    B1 --> B1a["定义:∃c>0, n₀>0"]
    B1 --> B1b["示例:4n²+100n+500=O(n²)"]
    B1 --> B1c["反例:n³-100n²≠O(n²)"]

    B2 --> B2a["定义:∃c>0, n₀>0"]
    B2 --> B2b["示例:4n²+100n+500=Ω(n²)"]
    B2 --> B2c["极端示例:n²/100-100n-500=Ω(n²)"]

    B3 --> B3a["定义:∃c₁,c₂>0, n₀>0"]
    B3 --> B3b["定理3.1:Θ ⟺ O ∧ Ω"]

    B4 --> B4a["定义:∀c>0, ∃n₀>0"]
    B4 --> B4b["极限刻画:lim→0"]
    B4 --> B4c["示例:2n=o(n²), 2n²≠o(n²)"]

    B5 --> B5a["定义:∀c>0, ∃n₀>0"]
    B5 --> B5b["极限刻画:lim→∞"]
    B5 --> B5c["示例:n²/2=ω(n), n²/2≠ω(n²)"]

    C --> C1["Θ是最精确的首选"]
    C --> C2["O用于上界声明"]
    C --> C3["Ω用于下界声明"]
    C --> C4["避免混淆O与Θ"]

    D --> D1["右侧独立出现=集合成员"]
    D --> D2["公式内部=匿名函数"]
    D --> D3["左侧出现=粗粒度约束"]

    E --> E1["等号滥用为∈"]
    E --> E2["变量从上下文推断"]
    E --> E3["O(1)的歧义"]
    E --> E4["小规模n的约定"]

    F --> F1["传递性"]
    F --> F2["自反性"]
    F --> F3["对称性"]
    F --> F4["转置对称性"]
    F --> F5["与实数运算的类比"]
    F --> F6["三歧性不成立"]

核心思想

核心思想

本节的核心思想是:渐近记号本质上是函数集合,我们用等号”=“来代替集合成员符号"",这种”滥用”在数学上是合理的,因为它赋予了渐近记号在等式和不等式中的强大表达能力。五种渐近记号从不同角度刻画函数的增长速率——大 O 给出上界(如同""),大 Ω 给出下界(如同""),大 Θ 给出紧确界(如同""),小 o 给出严格上界(如同""),小 ω 给出严格下界(如同"")。理解每种记号的形式化定义,是正确进行算法分析的基础。

1. O 记号——渐近上界

O 记号的形式化定义

对于给定函数 (读作”big-oh of of “)定义为如下函数集合:

直觉理解: 对于所有足够大的 (即 ),函数 的值始终位于 之上或 之上。 乘以一个常数因子后从上方”盖住”。

关键要点:

  • 定义要求 中的每个函数 都是渐近非负的(asymptotically nonnegative),即对于所有足够大的
  • 因此 本身也必须是渐近非负的,否则 为空集
  • 虽然定义使用集合,但我们写 而非

示例:证明

目标: 找到正常数 ,使得对所有 ,有

推导过程:

  1. 两边同除以 ),得
  2. 增大时, 趋近于 0
  3. 因此 的上确界趋近于 4
  4. 多组 可行:
    • ,则 可行(因为
    • ,则 可行(因为
    • ,则 可行(因为

结论: 越大,所需的 越接近最高次项系数 4。这说明低阶项在渐近意义下可以忽略

反例:证明

反证法: 假设 ,则存在正数 使得对所有 两边除以 ,即

但无论 取何值,当 时该不等式不成立。因此假设不成立,

直觉: 的增长速度远快于 ,即使 的系数是 这样的大负数,也无法将 项”压下去”。

2. Ω 记号——渐近下界

Ω 记号的形式化定义

对于给定函数 (读作”big-omega of of “)定义为如下函数集合:

直觉理解: 对于所有足够大的 的值始终位于 之上或 之上。 乘以一个常数因子后从下方”托住”

示例:证明

目标: 找到正数 ,使得对所有 ,有

两边除以

由于 ,所以 。取 为任意正整数即可。

结论: 低阶项只会让函数更大,因此==最高次项的系数就是 Ω 记号中 的最大可能取值==。

极端示例:证明

两边除以

虽然低阶项的系数很大(),但只要 足够大, 就会变得足够小:

  • ,则 (非常小但为正)
  • ,则

直觉: 越大, 越接近最高次项系数 。即使最高次项系数很小,只要它是正的,渐近下界就成立。

3. Θ 记号——渐近紧确界

Θ 记号的形式化定义

对于给定函数 (读作”theta of of “)定义为如下函数集合:

直觉理解: 的两个常数倍从上下两侧”夹住”,即 在渐近意义下只差常数因子。这是最精确的渐近描述。

定理 3.1

对于任意两个函数 ,有:

证明思路(练习 3.2-4):

  • () 若 ,由定义存在 使得 。取 即得 ;取 即得
  • () 若 ,则存在 使得 ),以及 使得 )。取 ,则两个不等式同时成立。

4. o 记号——严格上界(非紧确)

o 记号的形式化定义

与 O 记号的关键区别:

  • :存在某个 使得 (上界可能紧确)
  • :对任意 都存在 使得 (上界一定不紧确)

极限刻画(当极限存在时):

示例: (因为 ),但 (因为 )。

5. ω 记号——严格下界(非紧确)

ω 记号的形式化定义

等价定义:

极限刻画(当极限存在时):

示例: (因为 ),但 (因为 )。

6. 渐近记号与运行时间

使用渐近记号描述运行时间的原则

使用渐近记号刻画算法运行时间时,应遵循以下原则:

  1. 尽可能精确: 在不夸大的前提下,使用最精确的渐近记号。Θ 记号是最精确的首选
  2. 区分情况: 必须明确指出渐近界适用于哪种情况(最坏情况、最好情况、平均情况)
  3. 不要混淆 O 与 Θ: 说”一个 的算法比 的算法更快”是错误的,因为 的算法实际可能是

插入排序的示例:

  • 最坏情况运行时间:——其中 最精确
  • 最好情况运行时间:——其中 最精确
  • 不能说”插入排序的运行时间是 “——这是过度声明(因为最好情况是
  • 可以说”插入排序的运行时间是 “——这在所有情况下都成立
  • 不能说”插入排序的运行时间是 “——这是过度声明(因为最坏情况是
  • 可以说”插入排序的运行时间是 “——这在所有情况下都成立

归并排序的示例:

  • 所有情况下运行时间都是 ,因此可以直接说”归并排序的运行时间是 “而无需限定情况

7. 等式与不等式中的渐近记号

渐近记号在公式中的三种语义

情形一:右侧独立出现(集合成员) 当渐近记号单独出现在等式或不等式右侧时,等号表示集合成员关系:

情形二:公式内部(匿名函数) 当渐近记号出现在公式内部时,它代表某个我们不想命名的匿名函数: 意为:存在某个 (此处 ),使得

匿名函数的数量等于渐近记号出现的次数。例如 中只有一个匿名函数(关于 的函数),它不等价于

情形三:左侧出现(粗粒度约束) 当渐近记号出现在等式左侧时: 含义为:无论左侧的匿名函数如何选取(只要属于 ),都存在右侧的匿名函数(属于 )使等式成立。即右侧提供比左侧更粗粒度的描述。

链式等式: 逐个解释:第一个等式引入匿名函数 ,第二个等式说明对任意 (包括 ),都存在 使得

8. 合理滥用

渐近记号的常见"合理滥用"

滥用一:等号代替集合成员符号 我们写 而非 。这种滥用有精确的数学解释(如上所述),且使等式链更加简洁。

滥用二:从上下文推断趋于无穷的变量 时默认 ,写 时默认 。自由变量指示哪个变量趋于无穷。

滥用三: 的歧义 中没有变量出现,无法从表达式推断哪个变量趋于无穷。必须从上下文判断。例如 意味着 常数从上方界定。

滥用四:小规模 的约定 写 ” for ” 严格来说是无意义的(因为 的定义只约束 时的行为)。但约定含义是:存在正常数 使得 (对所有 )。类似地, for 意味着 时被正常数从上下界定。

滥用五:函数定义域的限制 当算法的运行时间函数仅在部分输入规模上有定义时(如要求 是 2 的幂),渐近记号中的约束只在函数有定义处成立。

9. 函数比较的性质

渐近记号的代数性质

都是渐近正函数,则以下性质成立:

传递性(Transitivity):

自反性(Reflexivity):

对称性(Symmetry):

转置对称性(Transpose Symmetry):

渐近记号与实数运算的类比

渐近记号实数类比含义
渐近上界
渐近下界
渐近紧确界
渐近严格小于
渐近严格大于
  • ,则称 渐近小于
  • ,则称 渐近大于

补充理解与拓展

拓展:为什么渐近记号不满足三歧性

实数的三歧性(Trichotomy)指出:对任意两个实数 三者恰有一个成立。然而,并非所有函数对都能进行渐近比较

反例: 考虑函数

  • 时,,此时
  • 时,,此时
  • 指数 之间连续振荡,取遍所有中间值

因此,既不存在 (因为 可以比 小得多),也不存在 (因为 可以比 大得多)。

来源:CLRS 第4版,第3.2节 “Comparing functions” 部分

拓展:极限判别法——用极限判断渐近关系

当极限 存在时( 可以是 ),可以通过 的值直接判断渐近关系:

极限值 渐近关系说明
同阶增长
增长更慢
增长更快

注意: 极限不存在时(如上述 的例子),此方法失效,需要回到定义本身进行判断。

来源:CLRS 第4版,第3.2节 o-notation 和 ω-notation 的极限刻画


易混淆点与辨析

混淆一:O 记号与 Θ 记号的误用

错误认知: 认为 就代表算法的运行时间”是” 级别,用 来表示紧确界。

正确理解: 只说明运行时间不超过 量级(上界),实际可能是 。要表示紧确界必须使用 记号。

典型错误表述: “一个 的算法比一个 的算法更快。”

  • 问题:那个” 的算法”实际运行时间可能是 ,比 更快
  • 修正:应该说”一个 的算法比一个 的算法更快”

实际影响: 在论文或技术讨论中,错误使用 代替 会导致读者对算法性能产生误判。

混淆二: 的区别

错误认知: 认为 是一样的,只是写法不同。

正确理解: 两者的关键区别在于常数的量化方式:

记号常数条件紧确性实数类比
(存在某个常数)可能紧确
(对所有常数)一定不紧确
(存在某个常数)可能紧确
(对所有常数)一定不紧确

具体示例:

  • ✓(紧确上界)且
  • ✓(非紧确上界)且
  • ✓(紧确下界)且
  • ✓(非紧确下界)且

记忆口诀: 小写字母 = 严格不等式,大写字母 = 非严格不等式。


习题精选


视频学习指南

推荐学习资源

资源主题时长说明
MIT 6.006 Lecture 2Asymptotic Notation~75minErik Demaine 讲解渐近记号的形式化定义与性质
MIT 6.006 Lecture 3Recurrences & Substitution~75min包含渐近记号在递归式中的应用
算法导论官方课程Chapter 3视章节而定CLRS 作者参与的课程录像

学习建议: 建议先阅读本笔记理解形式化定义,再通过视频加深对几何直觉(图 3.2 中的函数图像)的理解。重点关注讲师如何选择 来证明渐近关系。


教材原文

CLRS 第4版 第3.2节 原文摘录

O 记号定义: “For a given function , we denote by the set of functions .”

Θ 记号定义:.”

定理 3.1: “For any two functions and , we have if and only if and .”

关于 O 与 Θ 的混淆: “People occasionally conflate O-notation with Θ-notation by mistakenly using O-notation to indicate an asymptotically tight bound. They say things like ‘an -time algorithm runs faster than an -time algorithm.’ Maybe it does, maybe it doesn’t. Since O-notation denotes only an asymptotic upper bound, that so-called -time algorithm might actually run in time.”

关于合理滥用: “In mathematics, it’s okay — and often desirable — to abuse a notation, as long as we don’t misuse it. If we understand precisely what is meant by the abuse and don’t draw incorrect conclusions, it can simplify our mathematical language, contribute to our higher-level understanding, and help us focus on what really matters.”


参见: 3.1 O记号、Ω记号与Θ记号 | 3.3 标准记号与常见函数 | 2.2 算法分析 | 2.3 分治法

渐近记号