哈夫曼樹(Huffman tree)及哈夫曼編碼

基本術語

1、路徑和路徑長度

在一棵樹中存在着一個節點序列K1,K2,K3…Kj,使得Ki是Ki+1的雙親,則稱此節點序列是從K1~Kj的路徑,因爲樹中每個節點只有一個雙親節點,所以他也是這兩個之間的唯一路徑,從K1~Kj所經過的分支數稱爲這兩個節點之間的路徑長度,他等於路徑上的節點數減1.

2、節點權和帶權路徑度

在許多應用中將樹中的節點賦值一個有意義的實數,稱此實數爲該節點的權,節點的帶權路徑長度規定爲從樹根節點到該節點之間的路徑長度與該節點權的乘積。

3、樹的帶權路徑長度

樹的帶權路徑長度定義爲樹中所有葉子節點的帶權路徑長度之和,通常記爲:

4、哈夫曼樹(Huffman tree)

哈夫曼樹又稱爲最優二叉樹。他是n個帶權葉子節點構成的所有二叉樹中,帶權路徑長度WPL最小的二叉樹。因爲構造這種樹的算法最早是哈夫曼提出,所以稱爲哈夫曼樹。

例如,有4個葉子節點a,b,c,d。分別帶權爲9,4,5,2由他們構成三顆不同的二叉樹,如下 

 

每一顆二叉樹的帶權路徑長度WPL爲:

(1)、WPL=9*2+4*2+5*2+2*2=40

(2)、WPL=9*1+2*2+5*3+9*3=50

(3)、WPL=4*1+5*2+4*3+2*3=37

其中(3)的WPL最小。

因此,在n個帶權葉子節點所構成的二叉樹中,滿二叉樹或者完全二叉樹不一定是最優二叉樹,權值越大離根節點越近的樹纔是最優二叉樹。

構造哈夫曼樹

 

構造最優二叉樹的具體算法敘述如下:

(1)、n個權值的節點構造只有一個節點的樹集合F

(2)、在F中選出兩個權值最小的樹作爲一顆新樹的左右子節點,且設置新樹的根節點是左右子節點權值之和。

(3)、新樹加入F,同時刪除已被選中的兩顆樹

(4)、重複2和3,直到F中只有一棵樹爲止。

根據上述的算法描述,構造哈夫曼樹的圖示如下:

哈夫曼編碼

哈夫曼樹的應用很廣,哈夫曼編碼就是其中一種。

在電報通信中,電文是以二進制的0,1序列傳送的,在發送端需要將電文中的字符轉成二進制的0,1序列(即編碼),在接收端又需要將接收到的0,1轉換成對應的字符序列(即譯碼)。

最簡單的二進制編碼方式是登場編碼,若電文中只使用A,B,C,D,E,F這6個字符,若進行等長編碼,則需要二進制的三位即可,依次編碼爲:000,001,010,011,100,101,110。若用這6個字符作爲6個葉子節點,生成一顆二叉樹,讓該二叉樹的的左右節點分別用0,1編碼,從樹根節點到每個葉子節點的路徑上所經的0,1編碼序列等於該葉子節點的二進制編碼,則對應的編碼二叉樹,如下圖:

通常,電文中每個字符出現的頻率是不同的,在一份電報中,這個6個字符額出現頻率依次爲:4,2,6,8,3,2,則電文被編碼後的總長度可以有計算出:

L=3*(4+2+6+8+3+2)=75

可知,採用等長編碼時,傳送電文的總長度爲75。

那麼是否可以縮短傳送電文的長度呢?若採用不等長編碼,讓出現頻率高的字符具有較短的編碼,讓出現頻率低的字符具有較長的編碼,這樣有可能縮短電文的總長度。採用不等長編碼要避免譯碼時的多義性,假設用0表示D,用01表示C,則當接收到編碼後的字符串….01…時是按照0對應D譯碼還是按照01對應C譯碼,這裏就產生了多義性問題。因此對一個字符集進行不等長編碼時,則要求字符集中任意一個字符的編碼都不能是其他字符的前綴,符合此要求的編碼屬於無前綴編碼。

爲了使不等長編碼成爲無前綴編碼,可用該字符集中的每個字符作爲葉子節點生成一顆編碼二叉樹。爲了獲得電文的最短長度,可以將每個字符出現的頻率作爲葉子節點的權值,求出此樹的最小帶權路徑長度就等於求出了傳送電文的最短長度。

由前面生成哈夫曼編碼樹的算法可以生成如下:

由哈夫曼樹得到的字符編碼就稱爲哈夫曼編碼。其中A,B,C,D,E,F這6個字符對應的哈夫曼編碼依次爲:00,1010,01,11,100,1011。電文最終傳送的長度爲:

4*2+2*4+6*2+8*2+3*3+2*4=61,比等長編碼時的75減少了不少。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章