1. 程式人生 > 資訊 >50 多歲的“爬行者”再次行動,阿耳忒彌斯一號將於今夏飛往月球

50 多歲的“爬行者”再次行動,阿耳忒彌斯一號將於今夏飛往月球

哈夫曼編碼長度

構建哈夫曼樹:

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

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

各個字元出現的次數:

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

構建哈夫曼樹步驟

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

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

  3. 將新生成的節點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這一字串對應的哈夫曼樹後,按如下位置新增 01

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

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