哈夫曼樹與哈夫曼編碼


哈夫曼樹

構建哈夫曼樹的步驟:

  1. 將每一個數據從小到大進行排序,每個數據都是一個節點,每個【節點】可以看成是一顆【最簡單的二叉樹】
  2. 取出根節點權值最小的兩顆二叉樹,組成一顆新的二叉樹,該新的二叉樹的根節點的權值是前面兩顆二叉樹根節點權值的和
  3. 再將這顆新的二叉樹,以根節點的權值大小再次排序, 不斷重復 1-2-3 的步驟,直到數列中,所有的數據都被處理,就得到一顆赫夫曼樹

舉例:求hello_world 進行哈夫曼編碼后的長度

各個字符出現的次數:

h: 1
e: 1
l: 3
o: 2
_: 1
w: 1
r: 1
d: 1

開始構建哈夫曼樹

  1. 排序,得到8個葉子節點,即最簡單的8棵二叉樹

    image-20220316165444126

  2. 取出值最小的2棵樹,這里有6個節點權值均為1,任選2個,對其權值求和為2,所以得到一個新的節點”2“

    image-20220316165729164

  3. 將新生成的節點2與剩下的節點重新排序

    image-20220316170109916

    排序后:

    image-20220316170312985

    繼續構造:

    image-20220316170414918

    繼續排序……如此重復下去,然后把每次生成的節點在同一幅圖中繪制,就得到一棵哈夫曼樹,最終構建的哈夫曼樹是這樣的:

    image-20220316171027407

從圖中可以看出,紅色的都是生成的節點,其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這一字符串對應的哈夫曼樹后,按如下位置添加 01

image-20220316172746276

可以看出,每個葉子節點都可以用邊上的 0 和 1 來唯一表示

所以hello_world 各個字符的哈夫曼編碼為:

h: 0000  r: 0001  _: 0010 e: 0011 
w: 100  d: 101  o: 11
l: 01


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM