Appearance
题目
设字符集 S 包含 7 个字符,各字符出现的频次分别是 2, 3, 4, 6, 8, 10, 11。为 S 中的各字符构造哈夫曼编码,编码长度不小于 3 的字符个数是( )。
错因
A
只数到了频次最低的两个字符 2 和 3(位于树的最深层),把它们当作"长编码字符"的全部。事实上深度为 3 的 4、6、8 三个字符同样满足"编码长度不小于 3",被漏掉了。
B
只数到了深度恰为 3 的三个字符(4、6、8),忘记把深度 4 的两个字符(2、3)也算进来。"长度不小于 3"明显包含 4,"≥3 = =3" 是直觉陷阱。
C
数错了某一层叶子的位置,最常见的是把 10 或 11 误归到深度 3:哈夫曼算法里 10、11 分别在 19 = 9+10、25 = 11+14 的合并步中直接接到内部节点上,深度只有 2,不应计入。也可能是数对了深度 3 的 4、6、8 与深度 4 的 2、3,但误以为 2 和 3 共享同一个编码(实际是两个独立字符)。
总解析
思路:用经典 Huffman 算法逐步合并最小两个权值,直到只剩一棵树,再数每个叶子(= 字符)的深度即可。
构造过程(每步从队列里选最小两个合并,结果回插):
| 步骤 | 合并前队列(升序) | 取出 | 新合并节点 |
|---|---|---|---|
| 0 | 2, 3, 4, 6, 8, 10, 11 | — | — |
| 1 | 2, 3, 4, 6, 8, 10, 11 | 2, 3 | 5 |
| 2 | 4, 5, 6, 8, 10, 11 | 4, 5 | 9 |
| 3 | 6, 8, 9, 10, 11 | 6, 8 | 14 |
| 4 | 9, 10, 11, 14 | 9, 10 | 19 |
| 5 | 11, 14, 19 | 11, 14 | 25 |
| 6 | 19, 25 | 19, 25 | 44 (根) |
最终哈夫曼树:
逐叶子数深度(= 编码长度):
| 字符(频次) | 深度 | 编码长度 |
|---|---|---|
| 10 | 2 | 2 |
| 11 | 2 | 2 |
| 4 | 3 | 3 |
| 6 | 3 | 3 |
| 8 | 3 | 3 |
| 2 | 4 | 4 |
| 3 | 4 | 4 |
WPL 交叉验证("内部节点权值之和 = WPL"定理):
直接求和: ✓ 两侧一致,构造无误。
编码长度不小于 3 的字符是 4、6、8、2、3 共 5 个。
最终答案是 D。
编者注(答案存疑):本题部分参考资料给出答案 C(= 4 个)。从严格的哈夫曼算法推导,本题频次序列无平局,每一步合并都是唯一确定的,最终深度 ≥ 3 的叶子恰好有 5 个(深度 3 的 4、6、8 与深度 4 的 2、3),故答案为 D。如果你看到的参考答案是 C,建议交叉对比——常见错误是漏数了深度 4 的两个最小频次字符 2 和 3。