一种无损数据压缩算法,它使用少量比特来编码常用字符。哈夫曼编码将每个字符的概率近似为 1/2 的幂,以避免使用非整数比特来编码字符的实际概率所带来的复杂性。
哈夫曼编码处理权重列表 ,方法是构建一个具有最小加权扩展二叉树外部路径长度,并逐步找到两个最小的
,即
和
,将它们视为外部节点,并用权重为
的内部节点替换它们。重复此步骤,直到到达根节点。然后,可以通过 0(左分支)和 1(右分支)的二进制字符串对单个外部节点进行编码。
下面总结了前 13 个素数 2、3、5、7、11、13、17、19、23、29、31、37 和 41 的权重过程,结果树如上所示(Knuth 1997,pp. 402-403)。从图中可以清楚地看出,较大权重的路径比较小权重的路径短。在本例中,数字 13 将被编码为 1010。
| 2 | 3 | 5 | 7 | 11 | 13 | 17 | 19 | 23 | 29 | 31 | 37 | 41 |
| 5 | 5 | 7 | 11 | 13 | 17 | 19 | 23 | 29 | 31 | 37 | 41 | |
| 10 | 7 | 11 | 13 | 17 | 19 | 23 | 29 | 31 | 37 | 41 | ||
| 17 | 11 | 13 | 17 | 19 | 23 | 29 | 31 | 37 | 41 | |||
| 17 | 24 | 17 | 19 | 23 | 29 | 31 | 37 | 41 | ||||
| 24 | 34 | 19 | 23 | 29 | 31 | 37 | 41 | |||||
| 24 | 34 | 42 | 29 | 31 | 37 | 41 | ||||||
| 34 | 42 | 53 | 31 | 37 | 41 | |||||||
| 42 | 53 | 65 | 37 | 41 | ||||||||
| 42 | 53 | 65 | 78 | |||||||||
| 95 | 65 | 78 | ||||||||||
| 95 | 143 | |||||||||||
| 238 |
以下Wolfram 语言代码可用于构建内部节点列表和迭代表
HuffmanStep[l0_List] := Module[
{
l = l0,
s2 = Take[Select[Sort[l0], Positive], 2]
},
l[[Take[Flatten[Position[l, #]& /@ s2], 2]]] = 0;
l[[Last[Position[l, 0]]]] = Plus @@ s2;
{l, s2}
]
HuffmanList[l_List] := Module[{},
Plus @@@ Last /@ NestWhileList[
HuffmanStep[First[#]]&,
HuffmanStep[l], Length[Union[First[#]]] > 2&]
]
HuffmanTable[l_List] :=
NestWhileList[First[HuffmanStep[#]]&, l,
Length[Union[#]] > 2&]