3The Art of Computer Programming, Volume 1

决策树

决策与分支

决策树比较排序最优决策信息论下界

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第3章:决策树(Decision Trees)

一、导读

1.1 本章学习目标

第3章探讨决策树这一基本计算模型。决策树是分析算法下界的核心工具——通过证明任何算法都对应一棵决策树,然后用信息论方法计算决策树的最小深度,就能得到算法复杂度的下界。

本章核心学习目标:

  • 理解决策树模型:算法的每次比较对应树的一个内部节点
  • 掌握信息论下界:log₂(n!) 次比较是排序的下界
  • 理解比较排序的最优算法:归并排序和堆排序达到 O(n log n)
  • 学会用决策树分析搜索算法:二分搜索的最优性证明

1.2 为什么本章如此重要

决策树提供了分析算法下界的通用方法。当你想知道"这个问题最快能有多快"时,决策树和信息论就是答案。

1.3 核心问题引导

为什么基于比较的排序算法至少需要 Ω(n log n) 次比较?

信息论如何给出算法复杂度的下界?

决策树模型有什么局限性?


二、核心概念详解

2.1 决策树模型

决策树:
- 每个内部节点代表一次比较(如 aᵢ : aⱼ)
- 每个分支代表比较的结果(<, =, >)
- 每个叶节点代表一个输出(算法的结果)

示例: 在 3 个数中找最大值
           a:b
          / | \
        <  =   >
       /   |    \
    b:c   a:c   a:c
    / \   / \   / \
  <   > <   > <   >
  c   b a   c b   a
  b   c     b a   c

决策树深度 = 最坏情况比较次数 = 2

2.2 排序的下界

定理: 任何基于比较的排序算法在最坏情况下至少需要 ⌈log₂(n!)⌉ 次比较

证明:
1. n 个元素有 n! 种排列
2. 排序算法必须区分所有 n! 种排列
3. 决策树的叶节点数 ≥ n!
4. 二叉树深度 d 的叶节点数 ≤ 2ᵈ
5. 所以 2ᵈ ≥ n! → d ≥ log₂(n!)

Stirling 近似:
log₂(n!) = n log₂ n - n log₂ e + O(log n)
         = n log₂ n - 1.443n + O(log n)
         ≈ Θ(n log n)

具体值:
n=3:  log₂(6) = 2.58 → 至少 3 次比较
n=5:  log₂(120) = 6.91 → 至少 7 次比较
n=10: log₂(3628800) = 21.79 → 至少 22 次比较
n=100: log₂(100!) ≈ 525 → 至少 525 次比较

2.3 最优排序算法

归并排序:
- 最坏情况: n⌈log₂ n⌉ - 2^(⌈log₂ n⌉) + 1 次比较
- 接近下界 n log₂ n

堆排序:
- 最坏情况: 2n log₂ n 次比较
- 常数因子比归并排序大

Ford-Johnson 算法 (1959):
- 平均情况: n log₂ n - 1.414n 次比较
- 非常接近理论下界
- 但实际中很少使用(复杂度高,常数大)

三、实战案例

3.1 案例一:5 个元素排序的最优决策树

5 个元素排序:
理论下界: ⌈log₂(120)⌉ = 7 次比较

Knuth 给出的最优算法:
Step 1: 比较 a:b → 假设 a < b
Step 2: 比较 c:d → 假设 c < d
Step 3: 比较 a:c → 假设 a < c (现在 a 是最小的候选)
Step 4: 比较 b:e
Step 5: 比较 b:d (或 c:e,取决于 Step 4 的结果)
...

总共 7 次比较即可完成排序
(恰好达到理论下界)

四、本章小结

决策树是分析算法下界的基本工具

排序下界为 Ω(n log n),由信息论给出

归并排序在实际中接近最优


五、思考与练习

思考题

非比较排序(如计数排序)为什么能突破 O(n log n) 下界?

决策树模型能否用于分析非比较操作(如加法、移位)?

编程练习

为 4 个元素排序设计一棵最优决策树(5 次比较)。

实现归并排序,统计实际比较次数并与理论下界对比。


3/5决策树
0%