哈夫曼樹和哈夫曼編碼

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

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

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

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

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

image

節點若是像c中的方式分佈的話,WPL能取最小值(可證實),咱們稱爲哈夫曼樹。字符串

哈夫曼樹構造


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

image

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

哈夫曼樹應用


     在處理字符串序列時,若是對每一個字符串採用相同的二進制位來表示,則稱這種編碼方式爲定長編碼。若容許對不一樣的字符采用不等長的二進制位進行表示,那麼這種方式稱爲可變長編碼。可變長編碼其特色是對使用頻率高的字符采用短編碼,而對使用頻率低的字符則採用長編碼的方式。這樣咱們就能夠減小數據的存儲空間,從而起到壓縮數據的效果。而經過哈夫曼樹造成的哈夫曼編碼是一種的有效的數據壓縮編碼。it

     若是沒有一個編碼是另外一個編碼的前綴,則稱這樣的編碼爲前綴編碼。如0,101和100是前綴編碼。由前綴碼造成的序列能夠被惟一的組成一個字符串序列。如00101100能夠被惟一的分析爲0,0,101和100。class

示例:二叉樹

咱們對一個字符串進行統計發現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才能將該字符串存儲下。

 

在數據通訊中,須要將傳送的文字轉換成二進制的字符串,用0,1碼的不一樣排列來表示字符。例如,需傳送的報文爲「AFTER DATA EAR ARE ART AREA」,
這裏用到的字符集爲「A,E,R,T,F,D」,各字母出現的次數爲{8,4,5,3,1,1}。現要求爲這些字母設計編碼。要區別6個字母,最簡單的二進制編碼方式是等長編碼,
固定採用3位二進制,可分別用000、00一、0十、0十一、100、101對「A,E,R,T,F,D」進行編碼發送,當對方接收報文時再按照三位一分進行譯碼。
顯然編碼的長度取決報文中不一樣字符的個數。若報文中可能出現26個不一樣字符,則固定編碼長度爲5。然而,傳送報文時老是但願總長度儘量短。
在實際應用中,各個字符的出現頻度或使用次數是不相同的,如A、B、C的使用頻率遠遠高於X、Y、Z,天然會想到設計編碼時,讓使用頻率高的用短碼,使用頻率低的用長碼,以優化整個報文編碼。
相關文章
相關標籤/搜索