Huffman樹(哈夫曼樹)

2021-09-26 06:37:11 字數 2886 閱讀 2032

哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數)。樹的帶權路徑長度記為wpl=(w1*l1+w2*l2+w3*l3+...+wn*ln),n個權值wi(i=1,2,...n)構成一棵有n個葉結點的二叉樹,相應的葉結點的路徑長度為li(i=1,2,...n)。可以證明哈夫曼樹的wpl是最小的。

什麼是哈夫曼樹呢?

樣例解釋

哈夫曼樹是一種帶權路徑長度最短的二叉樹,也稱為最優二叉樹。下面用一幅圖來說明。

它們的帶權路徑長度分別為:

圖a: wpl=5*2+7*2+2*2+13*2=54

圖b: wpl=5*3+2*3+7*2+13*1=48

設 根節點深度為 0

理解就是各個點的編碼值和在哈夫曼生成樹上的深度的乘積的和

可見,圖b的帶權路徑長度較小,我們可以證明圖b就是哈夫曼樹(也稱為最優二叉樹)。

構建哈夫曼樹—————— 選集合中最小的兩個(every)

假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。 n個權值分別設為 w1、w2、…、wn,則哈夫曼樹的構造規則為:

將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有乙個結點);

在森林中選出兩個根結點的權值最小的樹合併,作為一棵新樹的左、右子樹,且新樹的根結點權值為其左、右子樹根結點權值之和;

從森林中刪除選取的兩棵樹,並將新樹加入森林;

重複(2)、(3)步,直到森林中只剩一棵樹為止,該樹即為所求得的哈夫曼樹。

三,哈夫曼編碼

利用哈夫曼樹求得的用於通訊的二進位制編碼稱為哈夫曼編碼。樹中從根到每個葉子節點都有一條路徑,對路徑上的各分支約定指向左子樹的分支表示」0」碼,指向右子樹的分支表示「1」碼,取每條路徑上的「0」或「1」的序列作為各個葉子節點對應的字元編碼,即是哈夫曼編碼。

就拿上圖例子來說:

a,b,c,d對應的哈夫曼編碼分別為:111,10,110,0

用圖說明如下:

記住,設計電文總長最短的二進位制字首編碼,就是以n個字元出現的頻率作為權構造一棵哈夫曼樹,由哈夫曼樹求得的編碼就是哈夫曼編碼

對n(≥)個權值均不相同的字元構造哈夫曼樹,則樹中任一非葉結點的權值一定不小於下一層任一結點的權值。

正確:哈夫曼樹的構造特點,為了使得wpl值最小,那麼越是值大的節點,他在哈夫曼生成樹上的深度越小

可以根據上述公式證明

,假設wpl值是個定值,增加val(i),要保持wpl的值不改變,那麼deep(i)必須相應的減少。

對n(n≥2)個權值均不相同的字元構造哈夫曼樹。下列關於該哈夫曼樹的敘述中,錯誤的是: 

1. 先去理解哈夫曼樹的構造過程,優先佇列,每次取兩個val最小的點,進行組合,所以,huffman樹中不會存在度數為0的點

2.同理,下面會給出**;

3.1-1已經證明

4.錯誤

n 個數值,進行編碼,求解wpl值的**,stl 優先佇列實現

**很重要,最好記下來

#include#define ll long long  

#define exp 1e-9

#define maxn 1000010

using namespace std;

int main( )

sum=0;

if(n==1)

else

else

} }

return 0;

}

2-5

已知字符集。若各字元的哈夫曼編碼依次是 0100, 10, 0000, 0101, 001, 011, 11, 0001,則編碼序列 0100011001001011110101 的解碼結果是:

這種題目:列舉暴力嘗試:

c語言實現huffman , 便於理解編碼過程,做題推薦上面的**,不推薦記憶;

#include #include#include#include #define maxbit      100

#define maxvalue 10000

#define maxleaf 30

#define maxnode maxleaf*2 -1

typedef struct

hcodetype; /* 編碼結構體 */

typedef struct

hnodetype; /* 結點結構體 */

/* 構造一顆哈夫曼樹 */

void huffmantree (hnodetype huffnode[maxnode], int n)

/* end for */

/* 輸入 n 個葉子結點的權值 */

for (i=0; i參考:

哈夫曼樹(huffman)

學完了huffman樹,講一下自己對它的理解 圖二public class huffmantree override public int compareto nonnull treenodeo else if this.weight o.weight return 0 傳乙個陣列進來 建立哈夫曼樹...

樹之哈夫曼 Huffman 樹

1.概念 實際生活中,樹中結點常常表示某種意義的數值,稱為該結點的權值。從根結點到任意結點的路徑長度 經過的邊數 與該結點上權值的乘積稱為該結點的帶權路徑長度。樹中所有葉結點的帶權路徑長度之和稱為該樹的帶權路徑長度,記為 wpl wi li i 1,2 n 帶權路徑長度 wpl 最小的二叉樹稱為哈夫...

哈夫曼(Huffman)樹構造和哈夫曼編碼

n個權值,則構造出的哈夫曼樹有 n個葉子結點。n個權值分別設為 w1,w2,wn,則哈夫曼樹的構造規則為 1 根據給定的 n個權值構成n 棵二叉樹的集合 f 2 每次選擇兩個權值最小的二叉樹做子樹合併為乙個新的二叉樹,新二叉樹的權值為兩個子樹的和。直到森林中只剩一棵樹為止,該樹即為我們所求得的哈夫曼...