亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

利用C++實現哈夫曼算法

2019-11-17 05:09:58
字體:
來源:轉載
供稿:網友

  我想每個計算機專業的學生或多或少都接觸過哈夫曼編碼,數據結構中的老問題了。大體就是給出一些字符,和這些字符的出現頻率,讓你為這些字符設計一個二進制編碼,要求頻率最高的字符的編碼最短。解決的方法是構造一棵哈夫曼樹(二叉樹),其基本思路是,每次從這些字符中挑出兩個頻率最低的,然后構造一個新的結點,使新結點的左右孩子指針分別指向那兩個節點。我想這個大家都很清楚了,我就不多說了。主要講下這次我用C++實現時碰到的問題。首先,我定義了一個哈夫曼樹結點:

class hNode
{
 public:
  friend bool Operator > (hNode n1,hNode n2); //定義了大于符號,供優先隊列排列使用
  hNode(string d="",int i=0,hNode* l = NULL,hNode* r =NULL):left(l),right(r),data(d),value(i){}
  hNode* left;
  hNode* right;
  string data; //儲存的字符串
  int value; //字符串出現的次數
};

bool operator >(hNode n1,hNode n2)
{
 return n1.value > n2.value;
}
  因為只是算法課的小作業,所以我也不預備為hNode定義完整的二叉樹操作,僅僅只是存放數據的對象,所以只有一個構造函數,并且所有的data member都是公有的。

  這此寫這個算法會碰到大麻煩,主要因為是用了std::PRiority_queue容器。當時考慮到在哈夫曼中要每次挑選兩個頻率最?。闯霈F次數最小,我那個hNode里的value是出現的次數),很自然的就想到了std::priority_queue容器,優先隊列每次都會彈出隊列中權值最高的元素,這個特性無疑是實現哈夫曼算法的最佳選擇。然而因為第一次用std::priority_queue容器,結果出了不少問題,好在最后都一一解決,也學到了不少東西。

  初步的設想是這樣的,先把所有的hNode對象都壓入優先隊列中去,然后每次彈出兩個,組成一個新的結點,再把新的結點壓入隊列,重復這一步驟,當隊列中只有一個元素時,哈夫曼樹也就完成了。像這樣:(是錯的,可別學)

while(...)
{
 std::priority_queue<hNode> q;
 .....
 hNode h1 = q.top();
 q.pop();
 hNode h2 = q.top();
 q.pop();
 hNode r;
 r.left = h1;
 r.right = h2;
 r.value = h1.value + h2.value;
 q.push(r);
}
  然而遭遇的第一個問題是,STL的所有容器的的插入都是基于by value語義的,也就是要生成一個對象的副本放在容器中。這樣的后果就是hNode的left,right指針都指到不知道什么地方去了。大家可以稍微畫幾個圖試一下,就知道出了什么問題了??紤]一下后,發現假如隊列里存放hNode的指針,就不會出現這個問題了,于是改寫成:

hNode* makeTree(priority_queue<hNode*> pq)
{
 hNode* p1 = NULL;
 hNode* p2 = NULL;
 hNode* r = NULL;
 while( !pq.empty())
 {
  p1 = pq.top();
  pq.pop();
  if (pq.empty())
  {
   r = p1;
   return r;
  }
  p2 = pq.top();
  pq.pop();
  r =new hNode;
  r->left = p1;
  r->right = p2;
  r->value = p1->value +p2->value;
  pq.push(r);
 }
 return NULL;
}
  然而馬上遭遇了第二個問題。std::priority_queue在判定優先關系的時候,直接比較指針的地址,而不是指針指向的對象的大小關系。而指針不是類,我沒辦法重寫指針的比較操作。程序陷入了困境之中。std::priority_queue默認使用Greater<>模板來生成一個function object來對元素進行比較,我試圖為Greater<>寫一個hNode*的特化版本來改變優先隊列對hNode*的比較,然而也沒有成功。山重水復疑無路之時,忽然想到為什么不直接為優先隊列寫一個function object來替代Greater<>不就可以了嗎?趕緊寫下如下代碼:

strUCt phNodeComp
{
 bool operator () (const hNode*& left,const hNode*& right) const
 {
  return left->value > right->value;
 }
};
  然后把std::priority_queue的申明變為:

priority_queue<hNode*,vector<hNode*>,phNodeComp > pq;
  終于把這個問題給解決了。
看樣子僅從書本上獲得的知識是不牢靠的,一定要自己實踐了才會有真正的熟悉。 更多文章 更多內容請看C/C++技術專題專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲天堂av网| 日日狠狠久久偷偷四色综合免费| 亚洲人午夜色婷婷| 国产成人综合一区二区三区| 全球成人中文在线| 97婷婷大伊香蕉精品视频| 成人久久久久久久| 日韩有码片在线观看| 欧美裸体xxxxx| 亚洲午夜国产成人av电影男同| 亚洲精选一区二区| 日韩精品免费观看| 亚洲aⅴ男人的天堂在线观看| 国产精品久久精品| 亚洲国产精彩中文乱码av| 91成品人片a无限观看| 久久久久久伊人| 亚洲在线免费看| 日韩欧美在线视频| 中文字幕欧美视频在线| 亚洲性猛交xxxxwww| 国产精品色午夜在线观看| 萌白酱国产一区二区| 成人激情在线播放| 国产精品久久精品| 国产精品久久综合av爱欲tv| 中文字幕亚洲欧美日韩高清| 亚洲开心激情网| 欧美视频在线看| 欧美人与性动交| 久久精品人人做人人爽| 91精品视频在线免费观看| 日韩电影中文字幕在线| 91精品国产高清| 日韩av一卡二卡| 成人精品网站在线观看| 国产精品日韩电影| 色琪琪综合男人的天堂aⅴ视频| 国产精欧美一区二区三区| 日韩精品在线免费播放| 欧美一级淫片丝袜脚交| 韩国精品美女www爽爽爽视频| 欧美香蕉大胸在线视频观看| 欧美激情一级二级| 亚洲国产精品久久久久久| 亚洲一区二区三区乱码aⅴ| 91精品国产综合久久香蕉的用户体验| 成人在线小视频| 亚洲最大福利视频网站| 日韩欧美一区二区三区| 亚洲精品一区中文字幕乱码| 亚洲在线免费看| 成年无码av片在线| 国产精品久久久999| 欧美黑人视频一区| 国产91精品在线播放| 欧美夫妻性视频| 成人h视频在线观看播放| 久久精品国产亚洲精品| 伊人伊成久久人综合网小说| 国产欧美一区二区白浆黑人| 最近2019中文免费高清视频观看www99| 26uuu另类亚洲欧美日本一| 亚洲人成啪啪网站| 91精品久久久久久久久久入口| 欧美乱妇高清无乱码| 欧美日韩中文字幕综合视频| 久久久久久久一区二区三区| 不卡伊人av在线播放| 日韩精品中文字幕在线观看| 日韩在线精品一区| 国产精品一区二区女厕厕| 在线视频国产日韩| 国产精品亚洲激情| 日韩av在线网页| 草民午夜欧美限制a级福利片| 日韩成人小视频| 亚洲精品国产精品自产a区红杏吧| 亚洲美女av在线| 亚洲免费人成在线视频观看| 97精品伊人久久久大香线蕉| 亚洲国产日韩精品在线| 国产成人久久久| 91亚洲国产成人久久精品网站| 日本中文字幕成人| 国产日韩欧美一二三区| 欧美另类在线播放| 成人免费视频97| 欧美激情亚洲一区| 正在播放欧美一区| 久久精品国产久精国产一老狼| 日韩精品视频在线观看免费| 亚洲区免费影片| 国产成人在线精品| 亚洲久久久久久久久久久| 色久欧美在线视频观看| 大胆欧美人体视频| 日韩欧美国产高清91| 欧美在线观看网址综合| 国内精品一区二区三区| 日本午夜精品理论片a级appf发布| 国产suv精品一区二区三区88区| 久久久久久久色| 久久噜噜噜精品国产亚洲综合| 日韩免费观看在线观看| 国产成人自拍视频在线观看| 精品国产欧美一区二区三区成人| 日韩欧美极品在线观看| 日本三级韩国三级久久| 在线看日韩av| 亚洲第一色在线| 亚洲xxxxx性| 亚洲精品一区在线观看香蕉| 永久免费毛片在线播放不卡| 欧美猛交ⅹxxx乱大交视频| 欧美巨大黑人极品精男| 97在线精品国自产拍中文| 在线视频精品一| 国产精品va在线播放我和闺蜜| 国产午夜精品视频免费不卡69堂| 国产精品三级网站| www.美女亚洲精品| 色狠狠av一区二区三区香蕉蜜桃| 青草青草久热精品视频在线网站| 久久影院模特热| 综合激情国产一区| 国产91精品久久久久久久| 91在线观看免费| 在线电影av不卡网址| 992tv在线成人免费观看| 一个人www欧美| 国产精品久久久久秋霞鲁丝| 日韩精品在线观看一区| 亚洲激情视频网站| 久久久久久久成人| 欧美有码在线观看视频| 国产免费一区视频观看免费| 疯狂做受xxxx欧美肥白少妇| 国产精品久久久久久久美男| 欧美激情亚洲另类| 亚洲欧洲一区二区三区久久| 欧美色道久久88综合亚洲精品| 亚洲欧美一区二区三区在线| 精品福利视频导航| 欧洲成人免费视频| 亚洲影院高清在线| www.亚洲一二| 久久影视电视剧免费网站清宫辞电视| 国产欧美久久一区二区| 亚洲人成电影网站色xx| 北条麻妃99精品青青久久| 影音先锋欧美在线资源| 日韩欧美第一页| 日韩在线视频线视频免费网站| 久久欧美在线电影| 日韩av网站电影| 国产精品久久久久aaaa九色| 麻豆国产va免费精品高清在线| 91av成人在线| 欧美精品激情视频| 亚洲精品自拍视频| 欧美又大又硬又粗bbbbb| 92福利视频午夜1000合集在线观看| 国产精品福利小视频|