多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 數(shù)據(jù)庫 > 數(shù)據(jù)庫應(yīng)用 > 數(shù)據(jù)結(jié)構(gòu) - 赫夫曼樹及其應(yīng)用

數(shù)據(jù)結(jié)構(gòu) - 赫夫曼樹及其應(yīng)用

來源:程序員人生   發(fā)布時間:2015-05-12 09:18:06 閱讀次數(shù):3625次

赫夫曼樹及其利用

    赫夫曼(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)樹) 。

Huffman樹的構(gò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。

Huffman編碼算法實(shí)現(xiàn)

(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| 美国一级毛片完整高清 | 亚洲国产精品视频 | 亚洲乱码中文字幕综合 | 色综合小说久久综合图片 |