資料結構之二叉樹的哈夫曼樹及其應用

2021-09-17 08:35:59 字數 1753 閱讀 8976

前面一篇介紹的是,二叉樹的一些基本概念、特徵以及它如何同樹、森林轉換之類,現在介紹的,二叉樹的另外一類,哈夫曼二叉樹樹。

哈夫曼樹(huffman)樹,又稱最優樹,是一類帶權路徑長度最短的樹,有著廣泛的應用(哈夫曼樹,並不針對只是二叉樹,其他的樹也可以是哈夫曼,只要滿足是帶權路徑最小即可),在這裡只討論哈夫曼樹的二叉樹。

——樹的每一層,到下一層的路徑距離,統一記為 1 。 樹中的乙個結點到另乙個結點的路徑,是由這兩個結點之間的分支所構成的,路徑上分支數目,稱為是它的路徑長度(對於樹來說,結點間的路徑是唯一的了,所以路徑長度也就是唯一的了,但是對於圖來說,兩個結點的路徑就不是唯一的了,路徑長度也就不唯一了)。

——樹的路徑長度,是從樹的根結點,到樹的每乙個結點的路徑長度之和,稱為 pl。經過計算,完全二叉樹具有最小到的二叉樹路徑(易見,因為完全二叉樹的結點都是先布滿一層再到下一層,所以在相同的結點數目下,其葉子結點最少,路徑長度之和最小)。

哈夫曼二叉樹:

哈夫曼二叉樹,,是帶權(weight)的二叉樹。這個權,不是指一層到下一層的距離加成,而是每乙個結點會有權值,權是在路徑的終點(記為wi),而不是在路徑之中。帶權路徑長度是兩個結點的距離,才乘以終點結點的權的乘積。

n 個葉子的二叉樹的帶權路徑長度定義是,wpl = wi x li 的和(i = 0,1,2……n)。在帶權的二叉樹中,其 wpl 值最小的二叉樹,稱為最優二叉樹,即是哈夫曼二叉樹。

不過值得一提的是,對於帶權的二叉樹,權都是放在了葉子結點,對於還有子結點的那些結點,是只作為中間結點,不設定權的。如果真的要計算其權值的話,就是其子結點的權值之和。

如何構建哈夫曼樹:

將構成森林 f 的樹,按照權值從小到大排列,將最小的兩個相加起來建立乙個結點,這兩個結點就作為它的子結點,並將新的結點放進去從小到大排列(那兩個最小的結點就不要進入序列裡了)。迴圈這麼做,直到最後,只有乙個結點,即是哈夫曼二叉樹了。

如下:

哈夫曼編碼:

哈夫曼樹在資料編碼中的乙個應用,就是資料的最小冗餘編碼問題(求一段字串按照怎麼樣的編碼方式來實現對映出來的二進位制位數最少)。

對於「abcd」這樣的字段,如果用二進位制編碼它,首先要確定的是,每個字元用二進位制怎麼表示,有以下解決方案:

每個字元都用固定長度的位數來表示,如用 00 、01 、10 、11,這樣子就是 00011011。但是 a 用兩個位來表示,浪費了。

每個字元不用固定長度的位數來表示,如用 0 、1 、01 、11,這樣子就是 0011011這樣子 。但是怎麼知道 01 是 『0』 和 『1』,還是「01」呢 ?這種情況的問題在於,如果需要編碼的物件太多了,如何避免歧義?

而哈夫曼編碼提出的方案是,先確定這個字串的各元素的出現頻率,這就是對應了哈夫曼二叉樹的權值,根據權值大小,對它們進行排列,構建二叉樹。這樣子每個元素在二叉樹裡都有對應的位址(可知,通過構建哈夫曼二叉樹的辦法,那些元素都是到了葉子的位置)。如果設定每個結點的左子樹,為 0 ,右子樹為 1 。則每個元素都有乙個編碼了。而那些路徑就是對應的元素的編碼位數。可見,出現頻率越高的,離根結點的距離越近,所以它所占用編碼位數越少。而只要構建好了這樣的二叉樹,從二進位制數解碼為字串的過程不過就是遍歷位址得到元素的過程(思路很巧妙呀)。

雖然這樣子需要每乙個字串都設定乙個哈夫曼二叉樹,但是如果已經有乙個程式來做的話,這樣的過程並不複雜。

上面關於哈夫曼編碼的過程,可見

鏈結裡配圖了,很詳細。

資料結構 哈夫曼二叉樹

今天我們來實現乙個哈夫曼二叉樹又稱最優二叉樹 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。實現原理其實很簡單對於某一些場景來說,某乙個區間段情況出現的機率是大很多的,比如成績處於中游水平的人肯定是佔大多數的,因此我們在取得這些資料時,如果按等概率去讀取會影響程式效率 所以我們可以利用哈夫...

資料結構 (二叉樹 哈夫曼編碼)

實現哈夫曼樹的建立演算法,並按哈夫曼樹實現哈夫曼編碼演算法。include include include include define maxvalue 10000 define maxleaf 30 葉子結點數 define maxnode maxleaf 2 1 樹中結點總數 using na...

資料結構實驗之二叉樹六 哈夫曼編碼

time limit 1000ms memory limit 65536k 有疑問?點這裡 字元的編碼方式有多種,除了大家熟悉的ascii 編碼,哈夫曼編碼 huffman coding 也是一種編碼方式,它是可變字長編碼。該方法完全依據字元出現概率來構造出平均長度最短的編碼,稱之為最優編碼。哈夫曼...