Huffman樹與Huffman編碼

2021-07-31 21:38:49 字數 1844 閱讀 3139

huffman tree簡介

赫夫曼樹(huffman tree),又稱最優二叉樹,是一類帶權路徑長度最短的樹。假設有n個權值,如果構造一棵有n個葉子節點的二叉樹,而這n個葉子節點的權值是,則所構造出的帶權路徑長度最小的二叉樹就被稱為赫夫曼樹。

這裡補充下樹的帶權路徑長度的概念。樹的帶權路徑長度指樹中所有葉子節點到根節點的路徑長度與該葉子節點權值的乘積之和,如果在一棵二叉樹中共有n個葉子節點,用wi表示第i個葉子節點的權值,li表示第i個也葉子節點到根節點的路徑長度,則該二叉樹的帶權路徑長度 wpl=w1*l1 + w2*l2 + ... wn*ln。

根據節點的個數以及權值的不同,赫夫曼樹的形狀也各不相同,赫夫曼樹具有如下特性:

對於同一組權值,所能得到的赫夫曼樹不一定是唯一的。

赫夫曼樹的左右子樹可以互換,因為這並不影響樹的帶權路徑長度。

帶權值的節點都是葉子節點,不帶權值的節點都是某棵子二叉樹的根節點。

權值越大的節點越靠近赫夫曼樹的根節點,權值越小的節點越遠離赫夫曼樹的根節點。

赫夫曼樹中只有葉子節點和度為2的節點,沒有度為1的節點。

一棵有n個葉子節點的赫夫曼樹共有2n-1個節點。

huffman tree的構建

赫夫曼樹的構建步驟如下:

1、將給定的n個權值看做n棵只有根節點(無左右孩子)的二叉樹,組成乙個集合ht,每棵樹的權值為該節點的權值。

2、從集合ht中選出2棵權值最小的二叉樹,組成一棵新的二叉樹,其權值為這2棵二叉樹的權值之和。

3、將步驟2中選出的2棵二叉樹從集合ht中刪去,同時將步驟2中新得到的二叉樹加入到集合ht中。

4、重複步驟2和步驟3,直到集合ht中只含一棵樹,這棵樹便是赫夫曼樹。

假如給定如下5個權值:

則按照以上步驟,可以構造出如下面左圖所示的赫夫曼樹,當然也可能構造出如下面右圖所示的赫夫曼樹,這並不是唯一的。

huffman編碼

赫夫曼樹的應用十分廣泛,比如眾所周知的在通訊電文中的應用。在等傳送電文時,我們希望電文的總長盡可能短,因此可以對每個字元設計長度不等的編碼,讓電文中出現較多的字元採用盡可能短的編碼。為了保證在解碼時不出現歧義,我們可以採取如下圖所示的編碼方式:

即左分支編碼為字元0,右分支編碼為字元1,將從根節點到葉子節點的路徑上分支字元組成的字串作為葉子節點字元的編碼,這便是赫夫曼編碼。我們根據上面左圖可以得到各葉子節點的赫夫曼編碼如下:

權值為5的也自己節點的赫夫曼編碼為:11

權值為4的也自己節點的赫夫曼編碼為:10

權值為3的也自己節點的赫夫曼編碼為:00

權值為2的也自己節點的赫夫曼編碼為:011

權值為1的也自己節點的赫夫曼編碼為:010

而對於上面右圖,則可以得到各葉子節點的赫夫曼編碼如下:

權值為5的也自己節點的赫夫曼編碼為:00

權值為4的也自己節點的赫夫曼編碼為:01

權值為3的也自己節點的赫夫曼編碼為:10

權值為2的也自己節點的赫夫曼編碼為:110

權值為1的也自己節點的赫夫曼編碼為:111

huffman樹(最優二叉樹 和huffman編碼

在許多實際應用中,數中結點常常被賦予乙個表示某種意義的數值,稱為該結點的權。從樹根結點到任意結點的路徑長度 經過的邊數 與該結點上權值的乘積稱為該結點的帶權路徑長度。數中所有葉結點的帶權路徑長度之和稱為該樹的帶權路徑長度 特點 1.每個初始結點最終都成為葉結點,且權值越小的結點到根節點的路徑長度越大...

Huffman樹與Huffman編碼

一.哈夫曼樹概念 路徑 祖先到節點之間的分支構成一條通往節點的路徑 路徑長度 路徑上分支的數目稱為路徑長度 節點的權 給樹中節點所設的物理意義的值 節點帶權路徑長度 從根到該點路徑長度與該點權值的乘機 huffman樹就是所有樹中每點帶權路徑加和最短的樹。二.huffman樹構造步驟 1.根據每個點...

樹 堆與Huffman樹

子女 兄弟鍊錶表示法,是一種二叉樹表示法。它的每個結點的度d 2,每個結點由3個域組成 data firstchild nextsibling 左孩子右兄弟。利用子女 兄弟鏈實現遍歷 樹的深度優先遍歷 利用遞迴進行先根次序遍歷和後根次序遍歷。樹的廣度優先遍歷 借助佇列。在訪問某一層的結點時,掃瞄它的...