哈夫曼编码:数据压缩的经典算法
1. 哈夫曼编码简介
哈夫曼编码是一种基于最小冗余编码的算法,也是最古老、最优雅的数据压缩形式之一。最小冗余编码的核心思想是:如果我们知道不同符号在一组数据中出现的频率,就可以用更少的空间来表示这些数据。具体做法是,用较少的比特位来编码出现频率高的符号,用较多的比特位来编码出现频率低的符号。这里的符号不一定是文本字符,可以是任意选定的数据量,通常为一个字节。
2. 熵与最小冗余
熵是衡量一组数据信息含量的指标。一组数据的熵是其每个符号熵的总和。符号 $z$ 的熵 $S_z$ 定义为:$S_z = -lgP_z$,其中 $P_z$ 是 $z$ 在数据中出现的概率。如果确切知道 $z$ 出现的次数,$P_z$ 就是 $z$ 的频率。
例如,若 $z$ 在 32 个符号中出现 8 次,即频率为 1/4,那么 $z$ 的熵为 $-lg(1/4) = 2$ 比特。这意味着用超过 2 比特来表示 $z$ 是多余的。通常一个符号用 8 比特(1 字节)表示,可见压缩在这种情况下有很大的提升空间。
下面通过一个包含 72 个实例、5 种不同符号的数据来计算熵,具体数据如下表:
| 符号 | 概率 | 每个实例的熵 | 总熵 |
| — | — | — | — |
| U | 12/72 | 2.584963 | 31.01955 |
| V | 18/72 | 2.000000 | 36.00000 |
| W | 7/72 | 3.362570 | 23.53799 |
| X | 15/72 | 2.263034 | 33.94552 |
| Y