根據最優二叉樹構造哈夫曼編碼
利用哈夫曼樹很容易求出給定字符集及其概率(或頻度)分布的最優前綴碼
技術
(
(
由哈夫曼樹求得編碼為最優前綴碼的原因
① 每個葉子字符c i 的碼長恰為從根到該葉子的路徑長度l i
夫曼樹是WPL最小的二叉樹
② 樹中沒有一片葉子是另一葉子的祖先
(
給定字符集的哈夫曼樹生成後
上溯時走左分支則生成代碼
注意
① 由於生成的編碼與要求的編碼反序
該向量中的起始位置(start初始時指示向量的結束位置)
② 當某字符編碼完成時
③ 因為字符集大小為n
(
typedef struct {
char ch; //存儲字符
char bits[n+
}CodeNode;
typedef CodeNode HuffmanCode[n];
void CharSetHuffmanEncoding(HuffmanTree T
{//根據哈夫曼樹T求哈夫曼編碼表H
int c
char cd[n+
int start; //指示編碼在cd中的起始位置
cd[n]=
for(i= H[i].ch=getchar();//讀入葉子T[i]對應的字符 start=n; //編碼起始位置的初值 c=i; //從葉子T[i]開始上溯 while((p=T[c].parent)>=0){//直至上溯到T[c]是樹根為止 //若T[c]是T[p]的左孩子,則生成代碼0;否則生成代碼1 cd[--start]=(T[p).1child==C)?'0':'1'; c=p; //繼續上溯 } strcpy(H[i].bits,&cd[start]); //復制編碼位串 }//endfor }//CharSetHuffmanEncoding 文件的編碼和解碼 有了字符集的哈夫曼編碼表之後,對數據文件的編碼過程是:依次讀人文件中的字符c,在哈夫曼編碼表H中找到此字符,若 H[i].ch=c,則將字符c轉換為H[i].bits中存放的編碼串。tW.WIngwIT.COM 對壓縮後的數據文件進行解碼則必須借助於哈夫曼樹T,其過程是:依次讀人文件的二進制碼,從哈夫曼樹的根結點(即T[m- 1])出發,若當前讀人0,則走向左孩子,否則走向右孩子。一旦到達某一葉子T[i]時便譯出相應的字符H[i].ch。然後重新從根出發 繼續譯碼,直至文件結束。 文件的編碼和解碼算法【參見練習】。
From:http://tw.wingwit.com/Article/program/sjjg/201311/23862.html