哈夫曼樹和哈夫曼編碼

2021-09-25 20:39:47 字數 2245 閱讀 4646

哈夫曼樹是一種帶權路徑長度最小的二叉樹,也叫最優二叉樹。

樹的帶權路徑長度指的是:

假設二叉樹有n個葉子結點,每個葉子結點都帶有權重,那麼這棵二叉樹的帶權路徑長度和為:從根節點到每乙個葉子結點的路徑長度*葉子結點權重的和,具體公式如下:

wk為第k個葉子結點的權重,lk為根節點到第k個葉子結點的路徑長度。

相關術語

1.樹的路徑長度:從根節點到各個葉子結點路徑長度之和;

2.結點帶權路徑長度:根節點到該節點的路徑長度乘以該節點權重;

最優二叉樹:樹的帶權路徑長度最小的二叉樹。

舉例子,2,3,5,9這四個結點可以構造幾個不同的二叉樹,如下:

5棵樹的帶權路徑長度分別為:

(a)wpl=2×2+3×2+5×2+9×2=38

(b)wpl=2×3+3×3+5×2+9×1=34

(c)wpl=2×2+3×3+5×3+9×1=37

(d)wpl=9×3+5×3+3×2+2×1=50

(e)wpl=2×1+3×3+5×3+9×2=44

(b)的權重路徑長度和最小,它的特點是,權重大的結點靠近根節點,權重小的結點遠離根節點。

構成最優二叉樹的方法由哈夫曼提出,因此也叫哈夫曼樹。哈夫曼樹的建立步驟如下:

1.給定n個權重為w1,w2,......,wn的結點,每乙個結點都能看成是只有乙個葉子結點的二叉樹,從而得到乙個二叉樹的集合f=;

2.從f中選擇根節點權重最小和次小的兩棵樹,作為一顆樹的左右子樹(誰左誰右都行),從而構建了一顆新的二叉樹,此二叉樹的根節點權重為左右子樹根節點權重之和;

3.從集合f中刪除已經使用了的最小和次小樹,並將新構建的二叉樹插入集合中;

4.重複2/3步驟,知道集合f只剩下一棵樹,這棵樹便是要構造的哈夫曼樹。

舉例:下面以例6-11中的葉結點權值:2、3、5、9為例,介紹哈夫曼樹的構造過程。

(1)取出權值最小的2和3,構成一棵二叉樹,如圖6-36(a)所示,其權值之和為5。

(2)再取出權值最小的5和5,構成一棵二叉樹,如圖6-36(b)所示,其權值之和為10。

(3)再取出權值最小的9和10,構成一棵二叉樹,如圖6-36(c)所示,其權值之和為19。

哈夫曼樹構造的具體實現

可以設定乙個結構陣列hfmt,用於儲存哈夫曼樹中各結點資訊,由二叉樹性質可知,具有n個結點的哈夫曼樹共有2n-1個結點,所以需要2n-1長度的陣列,其結構體形式如下:

分別儲存權重、左孩子結點在陣列中的下標、左孩子結點在陣列中的下標、此節點是否已經加入到要建立的哈夫曼樹中,parent初始為-1,如結點已加入哈夫曼樹,則parent的值為其父節點在陣列中的下標。

構建哈夫曼樹時,首先將由n個字元形成的n各葉節點存放到陣列hfmt的前n個分量中,然後根據哈夫曼方法的基本思想,不斷將權值最小的子樹合併成乙個較大的子樹,每次構成的新子樹的根節點順序存放到hfmt陣列中的前n個分量後面。

具體**如下:

#include #include using namespace std;

struct node

};void selectmin(const node hfmt,int k,int &index1,int &index2)

for(int i=0;ihfmt[i].weight)

index2=i;

}}void huffmantree(node hfmt,int w,int n)中各字串出現頻次;

2.以字串作為樹的結點的值,以頻次作為結點的權重,構建哈夫曼樹;

3.規定哈夫曼樹左分支代表0,右分支代表1,則從根節點到每個葉子結點路徑上的01,就構成了該節點的哈夫曼編碼值。

舉例子:

設有a、b、c、d、e、f六個資料項,其出現的頻度分別為6、5、4、3、2、1,試構造一棵哈夫曼樹,並確定它們的哈夫曼編碼。

哈夫曼編碼 哈夫曼樹

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

哈夫曼樹 哈夫曼編碼

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

哈夫曼編碼 哈夫曼樹

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