赫夫曼樹及其應用

赫夫曼樹

  • 路徑長度
    從樹中一個結點到另一個結點之間的分支構成兩個結點之間的路徑,路徑上的分支數目稱作路徑長度。對於二叉樹a,根結點到結點D的路徑長度就爲4,二叉樹b中根結點到結點D的路徑長度爲2。
  • 樹的路徑長度
    從樹根到每一結點的路徑長度之和。二叉樹a中的樹路徑長度爲1+1+2+2+3+3+4+4=20,二叉樹b的樹路徑長度爲1+2+3+3+2+1+2+2=16
  • 帶權結點
    如果考慮到帶權的結點,結點的帶權的路徑長度爲從該結點到樹根之間的路徑長度與結點上權的乘積。樹的帶權路徑長度爲樹中所有葉子結點的帶權路徑長度之和。
  • 赫夫曼樹的定義
    假設有n個權值{w1,w2,……,wn},構造一棵有n個葉子結點的二叉樹,每個葉子結點帶權wk,每個葉子的路徑長度爲lk,我們通常記作,則其中帶權路徑長度WPL最小的二叉樹稱作赫夫曼樹(最優二叉樹)。對於二叉樹a的WPL值有WPL=5*1+15*2+40*3+30*4+10*4=315;對於二叉樹b的WPL值有5*3+15*3+40*2+30*2+10*2=220

在這裏插入圖片描述

構造赫夫曼樹

首先我們先通過上述示例來構造這棵赫夫曼樹。
1、先把有權值的葉子結點按照從小到大的順序排列成一個有序序列,即A5, E10, B15, D30, C40
2、取頭兩個最小權值的結點作爲一個新結點N1的兩個子結點,注意相對較小的時左孩子,這裏A就是N1的左孩子,E是N1的右孩子,此時新結點的權值就是兩個葉子權值的和15;
3、將N1替換A與E,插入有序序列中,保持從小到大排列,即: N115, B15, D30, C40。
4、重複步驟2,將N1與B作爲一個新結點N2的兩個子結點,此時新結點N2的權值爲30;
5、將N2替換N1與B,插入有序序列中,保持從小到大排列,即:N230,D30,C40;
6、重複步驟2,將N2與D作爲新結點N3的兩個子結點,N3的權值爲60;
7、將N3替換N2與D,插入有序序列中,保持從小到大排列,即C40,N360。
8、重複步驟2,將C與N3作爲一個新結點T的兩個子結點,T即是根結點,完成赫夫曼樹的構造。
在這裏插入圖片描述
此時的二叉樹帶權路徑長度WPL=401+302+153+104+5*4=205,顯然此時構造出的二叉樹纔是最優的赫夫曼樹。
通過剛纔的步驟,我們可以總結出構造赫夫曼樹樹的赫夫曼算法描述:

1、根據給定的n個權值{w1,w2,……,wn}構造n棵二叉樹的集合F={T1, T2, ……,Tn},其中每棵二叉樹Ti中只有一個帶權爲wi根結點,其左右子樹均爲空;
2、在F中選取兩棵根結點的權值最小的樹作爲左右子樹構造一棵新的二叉樹,且置新的二叉樹的根結點的權值爲其左右子樹上根結點的權值之和;
3、在F中刪除這兩棵樹,同時將新得到的二叉樹加入F中;
4、重複步驟2和3,直到F只含一棵樹爲止,這棵樹便是赫夫曼樹。

赫夫曼編碼

  • 前綴編碼
    若要設計長度不等的編碼,則必須是任一字符的編碼都不是另一個字符的編碼的前綴,這種編碼稱作前綴編碼。
  • 赫夫曼編碼
    一般地,設需要編碼的字符集爲{d1,d2,……,dn},各個字符在電文中出現的次數或者頻率集合爲{w1, w2, ……,wn},以d1,d2,……,dn作爲葉子結點,以w1,w2……,wn作爲相應葉子結點的權值來構造一棵赫夫曼樹。規定赫夫曼樹的左分支代表0,右分支代表1,則從根結點到葉子結點所經過的路徑分支組成的0和1的序列便是該結點對應字符的編碼,這就是赫夫曼編碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章