“Huffman 编码在整数可行长度中求精确的逐符号最优解;无噪声编码定理则对长块应用同一约束,把每符号整数舍入损失压到零。”
形式陈述
标准二元 Huffman 算法的输入是至少含两个符号的有限字母表
- 为每个符号建立权重为
的叶; - 反复取当前权重最小的两个节点,以权重之和建立父节点;
- 直到只剩根,在每条左、右边分别标
0,1;根到叶路径就是码字。
得到的二叉树最小化
在所有二元逐符号前缀码中的值。由于任何唯一可译长度都满足 Kraft–McMillan 条件并可由同长度前缀码实现,它也给出逐符号唯一可译码的最小平均长度。
这个精确最优性结论的范围是:有限字母表、已知单符号概率、二元码字母表、无失真、逐符号、无长度上限。离散无记忆源使这个单符号目标直接等于长期逐符号平均,但算法本身不建模跨符号相关性。
直觉
深度每增加一,符号每次出现就多花一 bit,所以最小概率符号最适合占据最深叶。Huffman 算法先把两个最轻符号绑成同胞,相当于先决定它们共享最长前缀,再把这个合并节点当成一个概率为两者之和的新符号继续处理。
这是一个有证明义务的贪心算法:局部选择之所以安全,不是因为“概率小看起来该放深”,而是任何最优树都能通过交换改造成同意这个选择。
最优性的证明机制
正概率最优树不需要只含一个孩子的内部节点:收缩该边会缩短其全部后代的码字并严格降低平均长度。因此可取满二叉前缀树,其中最深叶成对出现。把两个最小概率符号与一对最深同胞交换,只会把小权重移到不短的位置,因此平均长度不增;故存在一棵最优树让最小的两个概率
归纳从 0,1 即得最小平均长度
因为
例子与边界
可复算例:
合并轨迹为
一种输出是
码长
源熵为
并列权重可能产生不同码树,但平均长度同样最优。
超出精确范围的失败情形
若源以相等概率产生块 00 或 11,单字母边缘是公平比特,逐符号 Huffman 仍需 0 或 1,即
单符号源须先声明消息数:外部已约定一个块时可用空码字;若须从无分隔符码流恢复未知重复次数,最短合法码字仍需一 bit。零概率符号、码长上限、不等码字符成本以及
若用二叉堆实现最小优先队列,每次合并执行两次取最小和一次插入。共有
推论与应用
Kraft–McMillan 不等式提供可行长度约束,Huffman 在其中解决有限分布的整数优化。对长源块再运行 Huffman 可以把每符号开销降到
实际压缩器常把 Huffman 与上下文模型、游程变换或字典方法组合。此时 Huffman 只负责把模型给出的有限符号概率变成前缀码,整体性能还取决于模型是否捕捉相关性。
长度选好后,规范Huffman码用符号顺序和码长表重建唯一的bit映射,并以整数空槽检查拒绝过订长度。这是码表表示与传输的接口,不重新证明或扩大本页的最优性范围。完整压缩流再规定EOF、位序和填充;ABABA的正文7位、含EOF有效码9位与整份文件200位分别属于不同账本。
若每符号码长还必须不超过给定上限,package-merge限长优化重新求解带约束的长度选择,而不是截短本算法的输出。权重1、1、2、3、5、8的无上限成本45需最深5层;上限3时最优成本47。原来的无上限交换证明与规范码映射接口继续保留。
参考资料
- David A. Huffman, “A Method for the Construction of Minimum-Redundancy Codes,” Proceedings of the IRE 40(9), 1952, pp. 1098–1101.
- Thomas M. Cover and Joy A. Thomas, Elements of Information Theory, 2nd ed., Wiley, 2006, §5.8.
- Robert G. Gallager, Information Theory and Reliable Communication, Wiley, 1968, §3.4.