1. 程式人生 > 其它 >【C# 資料結構與演算法】哈夫曼樹

【C# 資料結構與演算法】哈夫曼樹

哈夫曼樹

定義

在含有n個帶權葉結點的二叉樹中,其中帶權路徑長度(WPL)最小的二叉樹稱為哈夫曼樹,也稱最優二叉樹
 

構造哈夫曼樹

給定n個權值分別為w1, w2..., wn的結點,構造哈夫曼樹的演算法描述如下:
1)將這n個結點分別作為n棵僅含一個結點的二叉樹,構成森林F。
2)構造一個新結點,從F中選取兩棵根結點權值最小的樹作為新結點的左,右(順序任意)子樹,並且將新結點的權值 置為左、右子樹上根結點的權值之和。
3)從F中刪除剛才選出的兩棵樹,同時將新得到的樹加入F中。
4)  重複步驟2)和3),直至F中只剩下一棵樹為止。

第一種方式

1)在森林中選擇權值最小的兩個子樹組成新的子樹:選a(權值為1) 和c(權值為2) 組成一個二叉樹 (權值 1+2);

2)新組成的子樹(權值為3),將新的子樹放入森林中。

3)重複(1)和(2)步驟。

 第二種方式

 特點

1)每個初始結點最終都成為葉結點,且權值越小的結點到根結點的路徑長度越大

2)哈夫曼樹的結點總數為2n -1
3)哈夫曼樹中不存在度為1的結點。
4)哈夫曼樹並不唯一,但WPL必然相同且為最優

應用

用於編碼

有哈夫曼樹得到哈夫曼編碼――字符集中的每個字元作為一個葉子結點,各個字元出現的頻度作為結點的權值,根據之前介紹的方法構造哈夫曼樹。路徑左邊為1,右邊為0(順序隨便)


1)固定長度編碼――每個字元用相等長度的二進位制位表示

2)可變長度編碼――允許對不同字元用不等長的二進位制位表示,此時的權值表示概率。概率高的離根節點越近。

假設,100題中有80題選c,10題選A,8題選B,2題選D

固定長度編碼


可變長度編碼

 用於資料壓縮