哈夫曼樹

1. 哈夫曼樹的基本概念 
  哈夫曼樹( Huffman )又稱最優二叉樹,是一類帶權路徑長度最短的樹,有着廣泛的應用。
  在討論哈夫曼樹之前首先需要弄清楚關於路徑和路徑長度的概念。樹中兩個結點之間的路徑由一個結點到另一結點的分支構成。兩結點之間的路徑長度是路徑上分支的數目。樹的路徑長度是從根結點到每一個結點的路徑長度之和。
  設一棵二叉樹有 n 個葉子結點,每個葉子結點擁有一個權值W 1 ,W 2 , ...... W n ,從根結點到每個葉子結點的路徑長度分別爲 L1 , L2......Ln ,那麼樹的帶權路徑長度爲每個葉子的路徑長度與該葉子權值乘積之各。通常記作 WPL = L k. W k 。爲了直觀其見,在圖中把帶權的葉子結點畫成方形,其他非葉子結點仍爲圓形。請看圖 6.21 中的三棵二叉樹以及它們的帶權路徑長。

(a) wpl=38 (b) wpl=49 (c) wpl=36

圖 6.21 具有不同帶權路徑長度的二叉樹
注意:
這三棵二叉樹葉子結點數相同,它們的權值也相同,但是它們的 wpl 帶權路徑長各不相同。圖 6.21(c)wpl 最小。它就是哈曼樹,最優樹。哈夫曼樹是,在具有同一組權值的葉子結點的不同二叉樹中,帶權路徑長度最短的樹。也稱最優樹。

2. 哈夫曼樹的構造
構造哈夫曼樹的方法(貪婪方法)
對於已知的一組葉子的權值W 1 ,W 2...... ,W n
①首先把 n 個葉子結點看做 n 棵樹(僅有一個結點的二叉樹),把它們看做一個森林。
②在森林中把權值最小和次小的兩棵樹合併成一棵樹,該樹根結點的權值是兩棵子樹權值之和。這時森林中還有 n-1 棵樹。
③重複第②步直到森林中只有一棵爲止。此樹就是哈夫曼樹。現給一組 (n=4) 具體的權值 2 , 4 , 5 , 8 ,下邊是構造具體過程:

圖 6.22 哈夫曼樹構造過程
圖 6.22(a) 是一個擁有 4 棵小樹的森林,圖 6.22(b) 森林中還有 3 子棵樹,圖 6.22(c) 森林中剩下 2 棵樹,圖 6.22(d) 森林只有一棵樹,這棵樹就是哈夫曼樹。這裏或許會提出疑問, n 個葉子構成的哈夫曼樹其帶權路徑長度唯一嗎?確實唯一。樹形唯一嗎?不唯一。因爲將森林中兩棵權值最小和次小的子棵合併時,哪棵做左子樹,哪棵做右子樹並不嚴格限制。圖 6.22 之中的做法是把權值較小的當做左子樹 , 權值較大的當做右子樹。如果反過來也可以,畫出的樹形有所不同,但 WPL 值相同。爲了便於討論交流在此提倡權值較小的做左子樹 , 權值較大的做右子。

還有一點就是當外結點和內結點權值相同時,應該把內結點放在後面,即讓外節點先構成樹,這樣能使得最後的樹“最矮”(最長路徑儘可能短)

例子:對3,4,5,7構造哈弗曼樹。

3. 哈夫曼樹的應用 
(1) 用於最佳判斷過程。
  在考查課記分時往往把百分制轉換成優( x>=90 )、良 (80<x<90) 、中 (70<=x80) 、及格 (60<=x<70) 、不及格 (x<60) 五個等級。若不考慮學生考試分數的分佈概率,程序判定過程很容易寫成圖 6.23(a) 所示的方法。我們知道,一般來講學生考分大多分佈在 70 至 80 分之間,從圖 6.23(a) 可看出這種情的 x 值要比較 2 至 3 次才能確定等級。而學生中考試不及格的人數很少, x 值比較一次即可定等級。能否使出現次數多的在 70 至 80 分之間的 x 值比較次數減少些,而使很少出現的低於 60 分的 x 值比較次數多一些,以便提高程序的運行效率呢?假設學生成績對於不及格、及格、中等、良好和優秀的分佈概率分別爲 5 %, 15 %, 40 %, 30 %, 10 %,以它們做爲葉子的權值來構造哈夫曼樹,如圖 6.23(b) 所示。此時帶權路徑長最短,其值爲 205 %。它可以使大部分的分數值經過較少的比較次數得到相應的等級。但是,事務往往不是絕對的,此時每個判斷櫃內的條件較爲複雜,比較兩次,反而降低運行效率。所以我們採用折衷作法,調整後得圖 6.23(c) 判定樹。它更加切合實際。

(2) 用於通信編碼
  在通信及數據傳輸中多采用二進制編碼。爲了使電文儘可能的縮短,可以對電文中每個字符出現的次數進行統計。設法讓出現次數多的字符的二進制碼短些,而讓那些很少出現的字符的二進制碼長一些。假設有一段電文,其中用到 4 個不同字符A,C,S,T,它們在電文中出現的次數分別爲 7 , 2 , 4 , 5 。把 7 , 2 , 4 , 5 當做 4 個葉子的權值構造哈夫曼樹如圖 6.24(a) 所示。在樹中令所有左分支取編碼爲 0 ,令所有右分支取編碼爲1。將從根結點起到某個葉子結點路徑上的各左、右分支的編碼順序排列,就得這個葉子結點所代表的字符的二進制編碼,如圖 6.24(b) 所示。

  這些編碼拼成的電文不會混淆,因爲每個字符的編碼均不是其他編碼的前綴,這種編碼稱做前綴編碼。
  關於信息編碼是一個複雜的問題,還應考慮其他一些因素。比如前綴編碼每個編碼的長度不相等,譯碼時較困難。還有檢測、糾錯問題都應考慮在內。這裏僅對哈夫曼樹舉了一個應用實例。

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