主題
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&]

用 探索

參考文獻

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.

在 上引用

哈夫曼編碼

引用此內容為

Weisstein, Eric W. "哈夫曼編碼。"來自--一個 Wolfram 網路資源。https://mathworld.tw/HuffmanCoding.html

主題分類