哈夫曼樹
構建哈夫曼樹的步驟:
- 將每一個數據從小到大進行排序,每個數據都是一個節點,每個【節點】可以看成是一顆【最簡單的二叉樹】
- 取出根節點權值最小的兩顆二叉樹,組成一顆新的二叉樹,該新的二叉樹的根節點的權值是前面兩顆二叉樹根節點權值的和
- 再將這顆新的二叉樹,以根節點的權值大小再次排序, 不斷重復 1-2-3 的步驟,直到數列中,所有的數據都被處理,就得到一顆赫夫曼樹
舉例:求hello_world
進行哈夫曼編碼后的長度
各個字符出現的次數:
h: 1
e: 1
l: 3
o: 2
_: 1
w: 1
r: 1
d: 1
開始構建哈夫曼樹
-
排序,得到8個葉子節點,即最簡單的8棵二叉樹
-
取出值最小的2棵樹,這里有6個節點權值均為1,任選2個,對其權值求和為2,所以得到一個新的節點”2“
-
將新生成的節點2與剩下的節點重新排序
排序后:
繼續構造:
繼續排序……如此重復下去,然后把每次生成的節點在同一幅圖中繪制,就得到一棵哈夫曼樹,最終構建的哈夫曼樹是這樣的:
從圖中可以看出,紅色的都是生成的節點,其WPL值為 1*4+1*4+1*4+1*4+1*3+1*3+3*2+2*2=32
也可以直接將紅色節點的值加起來 2+2+2+4+4+7+11=32
二叉樹的帶權路徑長度(WPL):從根節點到各個葉子節點的路徑長度(即路徑邊數,如從11到h葉子節點長度為4)與相應節點權值(h的權值為1)的乘積的和:
\[WPL=\sum_{i=1}^n w_il_i \]哈夫曼樹就是構建出使得WPL最小的一棵二叉樹
哈夫曼編碼
構建出 hello_world
這一字符串對應的哈夫曼樹后,按如下位置添加 0
和 1
可以看出,每個葉子節點都可以用邊上的 0 和 1 來唯一表示
所以hello_world
各個字符的哈夫曼編碼為:
h: 0000 r: 0001 _: 0010 e: 0011
w: 100 d: 101 o: 11
l: 01