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

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > 018-Huffman樹-貪心-《算法設(shè)計(jì)技巧與分析》M.H.A學(xué)習(xí)筆記

018-Huffman樹-貪心-《算法設(shè)計(jì)技巧與分析》M.H.A學(xué)習(xí)筆記

來源:程序員人生   發(fā)布時(shí)間:2016-07-28 08:43:51 閱讀次數(shù):2475次

Huffman是完全2叉樹,權(quán)重較大的節(jié)點(diǎn)距離根較近。

Huffman編碼1種編碼方法,該方法完全根據(jù)字符出現(xiàn)幾率來構(gòu)造異字頭的平均長度最短的碼字

 

基本思路:

建立Huffman樹的進(jìn)程:

假定有n個(gè)權(quán)值,則構(gòu)造出的哈夫曼樹有n個(gè)葉子結(jié)點(diǎn)。 n個(gè)權(quán)值分別設(shè)為 w1w2wn,則哈夫曼樹的構(gòu)造規(guī)則為:

(1) w1w2wn看成是有n 棵樹的森林(每棵樹唯一1個(gè)結(jié)點(diǎn))

(2) 在森林當(dāng)選出兩個(gè)根結(jié)點(diǎn)的權(quán)值最小的樹合并,作為1棵新樹的左、右子樹,且新樹的根結(jié)點(diǎn)權(quán)值為其左、右子樹根結(jié)點(diǎn)權(quán)值之和;

(3)從森林中刪除選取的兩棵樹,并將新樹加入森林;

(4)重復(fù)(2)(3)步,直到森林中只剩1棵樹為止,該樹即為所求得的哈夫曼樹。

 

選取權(quán)值最小的結(jié)點(diǎn)時(shí)我們用最小堆。

需要得出各個(gè)字母的具體編碼,我們只需要在所有的左兒子的邊標(biāo)上0,右兒子的邊標(biāo)上1,從根節(jié)點(diǎn)到目標(biāo)節(jié)點(diǎn)的所有經(jīng)過的邊的碼就是該字母的編碼。

 

算法分析:

假定有n個(gè)字符。

把所有字符插入堆需要Θ(n),從堆中刪除兩個(gè)元素和新加1個(gè)元素需要O(log n)。重復(fù)n⑴次,所以總的時(shí)間復(fù)雜度是O(n log n)

 

偽代碼:

 


 

 

C++代碼:

//計(jì)算哈夫曼編碼下的文本占的位數(shù),并與定長編碼的比較。 #include<iostream> #include<string> #include<cstring> #include<iomanip> #include<cstdio> #include<queue> //哈夫曼樹,用優(yōu)先隊(duì)列實(shí)現(xiàn) using namespace std; int main() { string s; while (cin >> s) { if (s == "END") break; int len = s.size(); int date[30] = { 0 }; //date數(shù)組記錄text中各個(gè)字符的頻數(shù) priority_queue<int>q; for (int i = 0; i < len; i++) { if (s[i] == '_') date[0]++; else date[s[i] - 'A' + 1]++; } for (int i = 0; i < 27; i++) { if (date[i]!=0) q.push(-date[i]); //只把不同字符的頻數(shù)加入優(yōu)先隊(duì)列,字符本身與題目要求無關(guān) } //處理使小的數(shù)據(jù)的優(yōu)先級(jí)別高 int ans = 0; int tem; while (!q.empty()) { tem = -q.top(); //取出最小的兩個(gè)數(shù),相加累計(jì)到ans中,并加入隊(duì)列,1直處理到隊(duì)列中沒有數(shù) q.pop(); if (!q.empty()) { tem = tem - q.top(); q.pop(); } ans = ans + tem; if (!q.empty()) q.push(-tem); //若隊(duì)列已沒有數(shù)據(jù),則不添加(上面已取出最后兩個(gè),或1個(gè)),若沒有這1步,上面whlie的判斷不成立。 } int ans8 = len << 3; double bi = (double)ans8 / ans; printf("%d %d %.1lf\n", ans8, ans, bi); } }


 

 

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 肉动漫在线看 | 欧美笫一页 | 91一区二区三区 | 亚洲精品久久久久午夜三 | 国产区成人综合色在线 | 亚洲动漫第一页 | 曰本裸色私人影院噜噜噜影院 | 亚洲精品一区二区三区不卡 | 国产欧美日韩精品高清二区综合区 | 国产一区二区精品久久91 | 亚州色图欧美色图 | 日本久久综合视频 | 国产成人精品日本亚洲专一区 | 最新亚洲人成网站在线影院 | 成人a毛片高清视频 | 亚洲精品第一区二区在线 | 中国精品videossex中国高清 | 国产精品日产三级在线观看 | 欧美成人一区二区三区不卡视频 | 东北普通话清晰对白 | 亚州精品永久观看视频 | 国产精品亚洲综合 | 国产做人爱三级视频在线 | 国产黄色免费在线观看 | 国产a国产片色老头 | 中文字幕 亚洲 一区二区三区 | 两性午夜欧美高清做性 | 精品一区二区三区在线视频 | 在线看福利片 | 精品少妇一区二区三区视频 | 最近中文字幕mv免费高清视频7 | 日韩欧美在线视频 | 亚洲情区 | 成人精品国产 | 久久国产精品亚洲 | 久久国产精品免费视频 | 日韩欧美一区二区久久 | 亚洲麻豆精品 | 亚洲好视频 | 欧美国产成人一区二区三区 | 色综合久久久久久久久久久 |