主题
Search

哈夫曼编码


一种无损数据压缩算法,它使用少量比特来编码常用字符。哈夫曼编码将每个字符的概率近似为 1/2 的,以避免使用非整数比特来编码字符的实际概率所带来的复杂性。

哈夫曼编码处理权重列表 {w_i},方法是构建一个具有最小加权扩展二叉树外部路径长度,并逐步找到两个最小的w,即 w_1w_2,将它们视为外部节点,并用权重为w_1+w_2的内部节点替换它们。重复此步骤,直到到达根节点。然后,可以通过 0(左分支)和 1(右分支)的二进制字符串对单个外部节点进行编码。

HuffmanCoding

下面总结了前 13 个素数 2、3、5、7、11、13、17、19、23、29、31、37 和 41 的权重过程,结果树如上所示(Knuth 1997,pp. 402-403)。从图中可以清楚地看出,较大权重的路径比较小权重的路径短。在本例中,数字 13 将被编码为 1010。

2357111317192329313741
557111317192329313741
107111317192329313741
17111317192329313741
172417192329313741
2434192329313741
24344229313741
344253313741
4253653741
42536578
956578
95143
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&]

用 Wolfram|Alpha 探索

参考文献

Huffman, D. A. "A Method for the Construction of Minimum-Redundancy Codes." Proc. Inst. Radio Eng. 40, 1098-1101, 1952.Knuth, D. E. 计算机程序设计艺术,第 1 卷:基本算法,第 3 版。 Reading, MA: Addison-Wesley, pp. 402-406, 1997.Press, W. H.; Flannery, B. P.; Teukolsky, S. A.; and Vetterling, W. T. "Huffman Coding and Compression of Data." Ch. 20.4 in FORTRAN 数值方法:科学计算的艺术,第 2 版。 Cambridge, England: Cambridge University Press, pp. 896-901, 1992.Schwarz, E. S. "An Optimum Encoding with Minimum Longest Code and Total Number of Digits." Information and Control 7, 37-44, 1964.

在 Wolfram|Alpha 上引用

哈夫曼编码

引用此内容为

Weisstein, Eric W. "哈夫曼编码。"来自MathWorld--一个 Wolfram 网络资源。https://mathworld.net.cn/HuffmanCoding.html

主题分类