哈夫曼編碼

2021-08-02 09:47:25 字數 1337 閱讀 3040

今天看到一些有關樹的知識,又想起了哈夫曼樹,但是又忘了具體的,真是讓人惆悵。於是翻開《大話資料結構》這本書重溫一遍,跟著作者重溫哈夫曼樹和哈夫曼編碼。

哈夫曼樹的定義:帶權路徑長度的 wpl 最小的二叉樹稱為哈夫曼樹。

假設我們現在有 a b c d e ,權值分別為 5,15,40,30,10

什麼是帶權路徑長度?我們先看兩張圖:

我們先看一下什麼叫路徑長度:從樹的乙個結點到另乙個結點之間的分支構成兩個結點之間的路徑,路徑上的分支數目稱作路徑長度。

圖一中根節點到結點d的路徑長度為 4,二叉樹的路徑長度為 :

1 + 1 + 2 + 2 + 3 + 3 + 4 + 4 = 20 。

圖二中根節點到結點 d 的路徑長度為 2 ,二叉樹的長度為 :

1 + 1 + 2 + 2 + 2 + 2 + 3 + 3 = 16 。

帶權路徑長度就是對應的路徑長度跟結點上權值的積。

圖一根結點 到 結點d 的帶權路徑值為 5*4 = 20,圖二根節點到結點d的帶權路徑值為 5*2 = 10。

我們現在可以分別計算圖一跟圖二帶權路徑的長度,圖一:

wpl = 5*1 + 15*2 + 40*3 + 30*4 + 10*4 = 315 。

圖二:wpl = 5*3 + 15*3 + 40*2 + 30*2 + 10*2 = 220 。

圖二的帶權路徑長度明顯比普通二叉樹小。我們要做的就是構造一棵使得wpl最小的二叉樹。

接下來就是該如何去構造哈夫曼樹:

1.我們把帶權值的子節點按權值 遞增排序,如上面的例子,可以排序:

a5 , e10 , b15 , d30 , c40 。

2.取頭兩個權值最小的節點 a 和 e 作為乙個新節點 n1 的兩個子節點,權值小的位左子節點,大的為由子節點

3. 用 n1 代替 a 和 e 插入序列中,變成 n1,b,d,c

4. 重複步驟2 和 3

最終得到哈夫曼樹!

哈夫曼樹的主要應用則是哈夫曼編碼,主要是為了解決當年的遠端通訊優化問題,使用哈夫曼編碼可以縮減文字檔案的大小。

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....

哈夫曼樹 哈夫曼編碼

定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...

哈夫曼編碼 哈夫曼樹

哈夫曼樹是乙個利用權值進行優化編碼的乙個比較奇怪的樹,他的實現比較簡單,用途也比較單一。哈夫曼樹的實現,實現要求 通過哈夫曼樹可以保證在編碼過程中不會出現例如 1000和100這樣的編碼規則,否則就會編碼失敗,因為1000和100在某些情況下的編碼會一模一樣。通過哈夫曼樹可以保證權值大的值進行編碼時...