赫夫曼(Huffman)樹又稱最優(yōu)樹,是1類帶權(quán)路徑長度最短的樹,有著廣泛的利用。
1 基本概念
① 結(jié)點(diǎn)路徑:從樹中1個結(jié)點(diǎn)到另外一個結(jié)點(diǎn)的之間的分支構(gòu)成這兩個結(jié)點(diǎn)之間的路徑。
② 路徑長度:結(jié)點(diǎn)路徑上的分支數(shù)目稱為路徑長度。
③ 樹的路徑長度:從樹根到每個結(jié)點(diǎn)的路徑長度之和。
④ 結(jié)點(diǎn)的帶權(quán)路徑長度:從樹的根結(jié)點(diǎn)到該結(jié)點(diǎn)的的路徑長度與結(jié)點(diǎn)的權(quán)(值)的乘積。
權(quán)(值):各種開消、代價、頻度等的抽象稱呼。
⑤ 樹的帶權(quán)路徑長度:樹中所有葉子結(jié)點(diǎn)的帶權(quán)路徑長度之和,記做:
WPL=w1?l1+w2?l2+?+wn?ln=∑wi?li (i=1,2,?,n)
其中:n為葉子結(jié)點(diǎn)的個數(shù);wi為第i個結(jié)點(diǎn)的權(quán)值; li為第i個結(jié)點(diǎn)的路徑長度。
⑥ Huffman樹:具有n個葉子結(jié)點(diǎn)(每一個結(jié)點(diǎn)的權(quán)值為wi) 的2叉樹不止1棵,但在所有的這些2叉樹中,一定存在1棵WPL值最小的樹,稱這棵樹為Huffman樹(或稱最優(yōu)樹) 。
根據(jù)n個權(quán)值 {w1, w2, ?,wn},構(gòu)造成n棵2叉樹的集合F={T1, T2, ?,Tn},其中每棵2叉樹只有1個權(quán)值為wi的根結(jié)點(diǎn),沒有左、右子樹;
② 在F當(dāng)選取兩棵根結(jié)點(diǎn)權(quán)值最小的樹作為左、右子樹構(gòu)造1棵新的2叉樹,且新的2叉樹根結(jié)點(diǎn)權(quán)值為其左、右子樹根結(jié)點(diǎn)的權(quán)值之和;
③ 在F中刪除這兩棵樹,同時將新得到的樹加入F中;
④ 重復(fù)②、③,直到F只含1顆樹為止。
構(gòu)造Huffman樹時,為了規(guī)范,規(guī)定:
F={T1,T2, ?,Tn}中權(quán)值小的作為新構(gòu)造的2叉樹的左子樹,權(quán)值大的作為右子樹; 在取值相等時,深度小的作為新構(gòu)造的2叉樹的左子樹,深度大的作為右子樹。
例:構(gòu)造權(quán)值集合為W={8, 3, 4, 6, 5, 5}的 Huffman樹。
1 Huffman編碼
在電報收發(fā)等數(shù)據(jù)通訊中,常需要將傳送的文字轉(zhuǎn)換成由2進(jìn)制字符0、1組成的字符串來傳輸。為了使收發(fā)的速度提高,就要求電文編碼要盡量地短。
要設(shè)計長短不等的編碼,須保證任意字符的編碼都不是另外一個字符編碼的前綴,這類編碼稱為前綴編碼。
Huffman樹可以用來構(gòu)造編碼長度不等且譯碼不產(chǎn)生2義性的編碼。
設(shè)電文中的字符集C={c1,c2, ?,ci, ?,cn},各個字符出現(xiàn)的次數(shù)或頻度集W={w1,w2, ?,wi, ?,wn}。
Huffman編碼方法
以字符集C作為葉子結(jié)點(diǎn),次數(shù)或頻度集W作為結(jié)點(diǎn)的權(quán)值來構(gòu)造 Huffman樹。規(guī)定Huffman樹中左分支代表“0”,右分支代表“1” 。
從根結(jié)點(diǎn)到每一個葉子結(jié)點(diǎn)所經(jīng)歷的路徑分支上的“0”或“1”所組成的字符串,為該結(jié)點(diǎn)所對應(yīng)的編碼,稱之為Huffman編碼。
由于每一個字符都是葉子結(jié)點(diǎn),不可能出現(xiàn)在根結(jié)點(diǎn)到其它字符結(jié)點(diǎn)的路徑上,所以1個字符的Huffman編碼不多是另外一個字符的Huffman編碼的前綴。
若字符集C={a, b, c, d, e, f}所對應(yīng)的權(quán)值集合為W={8, 3, 4, 6, 5, 5},如圖6⑵5所示,則字符a,b, c,d, e,f所對應(yīng)的Huffman編碼分別是:10,010,011,00 ,110,111。
(1) 數(shù)據(jù)結(jié)構(gòu)設(shè)計
Huffman樹中沒有度為1的結(jié)點(diǎn),有n個葉子結(jié)點(diǎn)的Huffman樹共有2n⑴個結(jié)點(diǎn),則可存儲在大小為2n⑴的1維數(shù)組中。實(shí)現(xiàn)編碼的結(jié)點(diǎn)結(jié)構(gòu)如圖6⑵6所示。
緣由:
◆ 求編碼需從葉子結(jié)點(diǎn)動身走1條從葉子到根的路徑;
◆ 譯碼需從根結(jié)點(diǎn)動身走1條到葉子結(jié)點(diǎn)的路徑。
結(jié)點(diǎn)類型定義:
#define MAX_NODE 200 /* Max_Node>2n⑴ */
typedef struct
{ char elem; // 待編碼字符
unsigned int Weight ; /* 權(quán)值域 */
unsinged int Parent , Lchild , Rchild ;
} HTNode, *HuffmanTree ;
typedef char **HuffmanCode;
typedef struct Node
{
char elem;
unsigned int m_weight;
}Node; // 字符及其權(quán)值
(2) Huffman樹的生成
算法實(shí)現(xiàn)
待編碼字符的輸入:
cout<<"輸入要編碼字符個數(shù):" ;
cin>>n;
w=(Node *)malloc(n*sizeof(Node));
cout<<"輸入字符及其對應(yīng)的權(quán)值:"<<endl;
for(i=0;i<n;i++)
{
cin>>c>>wei;
w[i].elem=c;
w[i].m_weight=wei;
}
從前n個結(jié)點(diǎn)中,選取權(quán)值比較小的兩個:最小的下標(biāo)為s1,次小的下標(biāo)s2
void Select(HuffmanTree HT,int n,int &s1,int &s2)
{ int i; s1=s2=0;
for(i=1;i<=n;i++)
{ if((HT[i].m_weight<HT[s2].m_weight)&&(HT[i].parent==0)&&(s2!=0))
{ if(HT[i].m_weight<HT[s1].m_weight)
{ s2=s1; s1=i; }
else s2=i;
}
if((s1==0||s2==0)&&HT[i].parent==0)
{ if(s1==0) s1=i;
else if(s2==0)
{ if(HT[i].m_weight<HT[s1].m_weight)
{ s2=s1; s1=i; }
else s2=i;
} // end of else if
} // end of if
} // end of for
return;
}
新結(jié)點(diǎn)的構(gòu)造
for(i=n+1;i<=m;++i)
{
Select((*HT),i-1, s1,s2);
(*HT)[s1].parent=i; (*HT)[s2].parent=i;
(*HT)[i].lchild=s1;
(*HT)[i].rchild=s2;
(*HT)[i].m_weight=(*HT)[s1].m_weight+(*HT)[s2].m_weight;
}
(3) Huffman編碼算法
根據(jù)出現(xiàn)頻度(權(quán)值)Weight,對葉子結(jié)點(diǎn)的Huffman編碼有兩種方式:
① 從葉子結(jié)點(diǎn)到根逆向處理,求得每一個葉子結(jié)點(diǎn)對應(yīng)字符的Huffman編碼。
② 從根結(jié)點(diǎn)開始遍歷整棵2叉樹,求得每一個葉子結(jié)點(diǎn)對應(yīng)字符的Huffman編碼。
由Huffman樹的生成知,n個葉子結(jié)點(diǎn)的樹共有2n⑴個結(jié)點(diǎn),葉子結(jié)點(diǎn)存儲在數(shù)組HT中的下標(biāo)值為1∽n。
① 編碼是葉子結(jié)點(diǎn)的編碼,只需對數(shù)組HT[1…n]的n個權(quán)值進(jìn)行編碼;
② 每一個字符的編碼不同,但編碼的最大長度是n。
編碼
(*HC)=(HuffmanCode)malloc(n*sizeof(char*));
cd = (char *)malloc(n*sizeof(char));
cd[n-1]='
主站蜘蛛池模板:
午夜手机福利视频
|
日本zzzwww大片免费
|
亚洲图欧美
|
欧美性受xxxx喷水性欧洲
|
欧美一级免费观看
|
国产91色在线 | 亚洲
|
亚洲国产欧美国产第一区二区三区
|
亚洲精品天堂在线观看
|
国产免费福利视频一区二区
|
欧美中文小说在线观看
|
国产嫩草影院精品免费网址
|
欧美另类xxxx图片
|
国产人成精品午夜在线观看
|
亚洲精品欧美精品一区二区
|
亚洲精品中文字幕乱码三区一二
|
欧美videosex
|
岛国福利视频
|
国产精品第一页在线观看
|
天堂俺去俺来也www久久婷婷
|
www.大香|
亚洲精品在线视频
|
一区二区中文字幕在线观看
|
亚洲欧洲日产国产 最新
|
欧美人与动人物姣配xxxx
|
秋霞午夜视频在线观看
|
色午夜视频
|
在线高清一级欧美精品
|
国产不卡毛片
|
黄大色黄美女精品大毛片
|
亚洲视频在线不卡
|
欧美另类bbw
|
久久国产精品亚洲一区二区
|
久久综合一区二区三区
|
国产精品亚洲第一区二区三区
|
欧美小说图片
|
国产性生交xxxxx免费
|
性xxxxfreexxxxxvideo|
美国一级毛片完整高清
|
亚洲国产精品视频
|
亚洲乱码中文字幕综合
|
色综合小说久久综合图片
|