什么是哈夫曼樹


轉自:https://blog.csdn.net/shuangde800/article/details/7341289

 


 

  一、哈夫曼樹的概念和定義

 

什么是哈夫曼樹?

讓我們先舉一個樣例。

判定樹:

        在非常多問題的處理過程中,須要進行大量的條件推斷,這些推斷結構的設計直接影響着程序的運行效率。比如,編制一個程序,將百分制轉換成五個等級輸出。大家可能覺得這個程序非常easy,而且非常快就能夠用下列形式編寫出來:
 
	if(score<60)
		cout<<"Bad"<<endl;
	else if(score<70)
		cout<<"Pass"<<endl
	else if(score<80)
		cout<<"General"<<endl;
	else if(score<90)
		cout<<"Good"<<endl;
	else
		cout<<"Very good!"<<endl;

 
 
若考慮上述程序所耗費的時間,就會發現該程序的缺陷。在實際中,學生成績在五個等級上的分布是不均勻的。當學生百分制成績的錄入量非常大時,上述判定過程須要重復調用,此時程序的運行效率將成為一個嚴重問題。
 
但在實際應用中,往往各個分數段的分布並非均勻的。以下就是在一次考試中某門課程的各分數段的分布情況: 
 

 

 
以下我們就利用哈夫曼樹尋找一棵最佳判定樹,即總的比較次數最少的判定樹。
 
 
第一種構造方式:
 
 
 

 

 
另外一種構造方式:
 
 

 

 
 
這兩種方式,顯然后者的判定過程的效率要比前者高。我們稱判定過程最優的二叉樹為最優二叉樹
 
 
===================================================================================================
 

 定義哈夫曼樹之前先說明幾個與哈夫曼樹有關的概念:

路徑

  樹中一個結點到還有一個結點之間的分支構成這兩個結點之間的路徑。

路徑長度

  路徑上的分枝數目稱作路徑長度。

樹的路徑長度

  從樹根到每個結點的路徑長度之和。

結點的帶權路徑長度

  在一棵樹中,假設其結點上附帶有一個權值,通常把該結點的路徑長度與該結點上的權值之積,稱為該結點的帶權路徑長度(weighted path length, WPL)

  什么是權值?

     計算機領域中(數據結構

  權值就是定義的路徑上面的值。能夠這樣理解為節點間的距離。通常指字符相應的二進制編碼出現的概率。

  至於霍夫曼樹中的權值能夠理解為:權值大表明出現概率大!

  一個結點的權值實際上就是這個結點子樹在整個樹中所占的比例.

  abcd四個葉子結點的權值為7,5,2,4. 這個7,5,2,4是依據實際情況得到的,比方說從一段文本中統計出abcd四個字母出現的次數分別為7,5,2,4. 說a結點的權值為7,意思是說a結點在系統中占有7這個份量.實際上也能夠化為百分比來表示,但反而麻煩,實際上是一樣的.

 

樹的帶權路徑長度

  假設樹中每一個葉子上都帶有一個權值,則把樹中全部葉子的帶權路徑長度之和稱為樹的帶權路徑長度。

 

             設某二叉樹有n個帶權值的葉子結點,則該二叉樹的帶權路徑長度記為:

                                 

 

 

公式中,wk為第k個葉子結點的權值;lk為該結點的路徑長度。

 

演示樣例:

 



 
一般來說,用n(n>0)個帶權值的葉子來構造二叉樹,限定二叉樹中除了這n個葉子外僅僅能出現度為2的結點。
 
那么符合這樣條件的二叉樹往往可構造出很多顆, 當中帶權路徑長度最小的二叉樹就稱為最優二叉樹(哈夫曼樹)
 
 
 

 

它們的帶權路徑長度分別為:

圖a: WPL=5*2+7*2+2*2+13*2=54

圖b: WPL=5*3+2*3+7*2+13*1=48

可見,圖b的帶權路徑長度較小,我們可以證明圖b就是哈夫曼樹(也稱為最優二叉樹)。

 


免責聲明!

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



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