哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度(若根結點為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 每次選擇兩個權值最小的二叉樹做子樹合併為乙個新的二叉樹,新二叉樹的權值為兩個子樹的和。直到森林中只剩一棵樹為止,該樹即為我們所求得的哈夫曼...