數據結構之哈夫曼樹


1. 哈夫曼樹的基本概念

哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。

所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數)。樹的帶權路徑長度記為:

WPL=(W1*L1+W2*L2+W3*L3+...+ Wn*Ln)

N個權值Wi(i=1,2,...n)構成一棵有N個葉結點的二叉樹,相應的葉結點的路徑長度為Li(i=1,2,...n)

可以證明哈夫曼樹的WPL是最小的。

為了直觀其見,下圖中把帶權的葉子結點畫成方形,其他非葉子結點仍為圓形。請看下圖中的三棵二叉樹以及它們的帶權路徑長:

 

注意:這三棵二叉樹葉子結點數相同,它們的權值也相同,但是它們的 WPL帶權路徑長各不相同。圖(c)WPL最小。它就是哈曼樹,即最優樹。

 

2. 哈夫曼樹的構造
構造哈夫曼樹的方法 
對於已知的一組葉子的權值W 1 ,W 2...... ,W
首先把 n 個葉子結點看做 n 棵樹(僅有一個結點的二叉樹),把它們看做一個森林。 
在森林中把權值最小和次小的兩棵樹合並成一棵樹,該樹根結點的權值是兩棵子樹權值之和。這時森林中還有 n-1 棵樹。 
重復第步直到森林中只有一棵為止,此樹就是哈夫曼樹。

現給一組 (n=4) 具體的權值: 2 4 5 8 ,下邊是構造具體過程:

 

n 個葉子構成的哈夫曼樹其帶權路徑長度是唯一的,但樹形是不唯一的。因為將森林中兩棵權值最小和次小的子棵合並時,哪棵做左子樹,哪棵做右子樹並不嚴格限制。

 

3.  哈夫曼樹的應用

    在通信及數據傳輸中多采用二進制編碼。為了使電文盡可能的縮短,可以對電文中每個字符出現的次數進行統計。設法讓出現次數多的字符的二進制碼短些,而讓那些很少出現的字符的二進制碼長一些。

    假設有一段電文,其中用到 4 個不同字符A, C, S, T,它們在電文中出現的次數分別為 8 2 4 5 。把 8 2 4 5 當做 4 個葉子的權值構造哈夫曼樹如下圖所示。在樹中令所有左分支取編碼為 0 ,令所有右分支取編碼為1。將從根結點起到某個葉子結點路徑上的各左、右分支的編碼順序排列,就得這個葉子結點所代表的字符的二進制編碼,j結果如下圖所示。

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

 


免責聲明!

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



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