哈夫曼樹和哈夫曼編碼


      當樹中的節點被賦予一個表示某種意義的數值,我們稱之為該節點的權。從樹的根節點到任意節點的路徑長度(經過的邊數)與該節點上權值的乘積稱為該節點的帶權路徑長度。樹中所有葉節點的帶權路徑長度之和稱為該樹的帶權路徑長度(WPL)。當帶權路徑長度最小的二叉樹被稱為哈夫曼樹,也成為最優二叉樹。

     如下圖所示,有三課二叉樹,每個樹都有四個葉子節點a,b,c,d,分別取帶權7,5,2,4。他們的帶權路徑長度分別為

(a) WPL = 7x2+5x2+2x2+4x2=36

(b) WPL = 2X1+4X2+7X3+5X3 = 46

(c) WPL = 7x1+5x2+2x3+4x3 = 35

image

節點如果像c中的方式分布的話,WPL能取最小值(可證明),我們稱為哈夫曼樹。

哈夫曼樹構造

哈夫曼樹在構造時每次從備選節點中挑出兩個權值最小的節點進行構造,每次構造完成后會生成新的節點,將構造的節點從備選節點中刪除並將新產生的節點加入到備選節點中。新產生的節點權值為參與構造的兩個節點權值之和。舉例如下:

image

  • 備選節點為a,b,c,d,權值分別為7,5,2,4
  • 選出c和d進行構造(權值最小),生成新節點為e(權值為6),備選節點變為7,5,6
  • 選出b和e進行構造,生成新節點f(權值為11),備選節點為7,11
  • 將最后的7和11節點進行構造,最后生成如圖所示的哈夫曼樹

哈夫曼樹應用

     在處理字符串序列時,如果對每個字符串采用相同的二進制位來表示,則稱這種編碼方式為定長編碼。若允許對不同的字符采用不等長的二進制位進行表示,那么這種方式稱為可變長編碼。可變長編碼其特點是對使用頻率高的字符采用短編碼,而對使用頻率低的字符則采用長編碼的方式。這樣我們就可以減少數據的存儲空間,從而起到壓縮數據的效果。而通過哈夫曼樹形成的哈夫曼編碼是一種的有效的數據壓縮編碼。

     如果沒有一個編碼是另一個編碼的前綴,則稱這樣的編碼為前綴編碼。如0,101和100是前綴編碼。由前綴碼形成的序列可以被唯一的組成一個字符串序列。如00101100可以被唯一的分析為0,0,101和100。

示例:

我們對一個字符串進行統計發現a-f出現的頻率分別為a:45,b:13,c:12,d:16,e:9,f:5,我們對該字符串進行采用哈夫曼編碼進行存儲。

image

WPL = 1x45+3x(13+12+16)+4x(5+9)=224

這樣算下來使用224二進制位就可以將該字符串存儲起來,因為哈夫曼碼是前綴碼,所以可以唯一的還原出原來的字符序列。如果我們每個字符使用3位進行存儲(至少3位),那么需要300bit才能將該字符串存儲下。


免責聲明!

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



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