一種無損資料壓縮演算法,它使用少量位元來編碼常用字元。哈夫曼編碼將每個字元的機率近似為 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&]