數據結構(36)哈夫曼樹和哈夫曼編碼

目錄

1、哈夫曼樹的定義

2、哈夫曼樹的構造

3、哈夫曼編碼


1、哈夫曼樹的定義

在許多應用中,樹中結點常常被賦予一個表示某種意義的數值,稱爲該結點的權。從樹的根到任意結點的路徑長度(經過的邊數)與該結點上權值的乘積,稱爲該結點的帶權路徑長度。樹中所有葉結點的帶權路徑長度之和稱爲該樹的帶權路徑長度,記爲

式中,Wi是第i個葉結點所帶的權值,Li是該葉結點到根節點的路徑長度。

在含有n個帶權葉結點的二叉樹中,其中帶權路徑長度(WPL)最小的二叉樹稱爲哈夫曼樹,也稱最優二叉樹。例如,圖36-1中的3棵二叉樹都有4個葉子結點a,b,c,d,分別帶權7,5,2,4,他們帶權路徑長度分別爲

                                       圖36-1  具有不同帶權長度的二叉樹

(a)WPL = 7*2 + 5*2 + 2*2 + 4*2 = 36。

(b)WPL = 4*2 + 7*3 + 5*3 + 2*1 = 46;

(c)WPL = 7× I + 5× 2+2× 3 + 4× 3 = 35。

其中,圖36-1(c)樹的WPL最小。可以驗證,它恰好爲哈夫曼樹。

2、哈夫曼樹的構造

給定n個權值分別爲W1,W2,...,Wn的結點,構造哈夫曼樹的算法描述如下:

1)將這n個結點分別作爲n棵僅含一個結點的二叉樹,構成森林F。

2)構造一個新結點,從F中選取兩棵根節點權值最小的樹作爲新結點的左、右子樹,並且將新結點的權值置爲左、右子樹上根節點的權值之和。

3)從F中刪除剛纔選出的兩棵樹,同時將新得到的樹加入F中。

4)重複步驟2、3,直至F中止剩下一棵樹爲止。

                     圖36-2  哈夫曼樹的構造過程

從上述構造過程中可以看出哈夫曼樹具有如下特點:

1)每個初始結點最終都成爲葉結點,且權值越小的結點到根節點的路徑越長。

2)構造過程中共新建了n-1個新結點(雙分支結點),因此哈夫曼樹的結點總數爲2n-1。

3)每次構造都選擇2棵樹作爲新結點的孩子,因此哈夫曼樹中不存在度爲1的結點。

3、哈夫曼編碼

在數據通信中,若對每個字符用相等長度的二進制位表示,稱這種編碼方式爲固定長度編碼。若允許對不同字符用不等長的二進制位表示,則這種編碼方式成爲可變長度編碼。可變長度編碼比固定長度編碼要好很多,其特點是對頻率高的字符賦以短編碼,而對頻率較低的字符賦以較長一些的編碼,從而可以使字符的平均編碼長度減短,起到壓縮數據的效果。哈夫曼編碼是一種被廣泛應用而且非常有效的數據壓縮編碼。

若沒有一個編碼是另一個編碼的前綴,則稱這樣的編碼爲前綴編碼。舉例:設計字符A,B和C的對應的編碼0,101,100是前綴編碼。對前綴編碼的解碼很簡單,因爲沒有一個編碼是其他編碼的前綴。所以識別出第一個個編碼,將它翻譯爲原碼,再對餘下的編碼文件重複同樣的解碼操作。例如,碼串00101100可被唯一地翻譯爲0,0,101,100。另舉反例:如果再將字符D的編碼設計爲00,此時0是00的前綴,碼串00101100的前兩位就無法唯一翻譯。

由哈夫曼樹得到哈夫曼編碼是很自然的過程。首先,將每個出現的字符當做一個獨立的結點,其權值爲它出現的頻度(或次數),構造出對應的哈夫曼樹。顯然,所有字符結點都出現在葉結點中。我們可將字符的編碼解釋爲從根至該字符的路徑上邊標記的序列,其中邊標記爲0的表示“轉向左孩子”,標記爲1的表示“轉向右孩子”。圖36-3所示爲一個由哈夫曼樹構造哈夫曼編碼的實例,矩形方塊表示字符及其出現的次數。

這課哈夫曼樹的WPL爲:1*45+3*(13+12+16)+4*(5+9) = 224.

此處的WPL可視爲最終編碼得到二進制編碼的長度,共224位。若採用3位固定長度編碼,則需要300位。

注意:0和1表示左子樹還是右子樹沒有明確規定。左、右孩子結點的順序是任意的,所以構造出的哈夫曼樹並不唯一,但各哈夫曼樹的帶權路徑長度WPL相同且爲最優。

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