真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c++中怎么實(shí)現(xiàn)一個哈希慢算法-創(chuàng)新互聯(lián)

c++中怎么實(shí)現(xiàn)一個哈希慢算法,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們在業(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)建站提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運(yùn)營等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡(luò)營銷方法,創(chuàng)造更大的價值。

首先,我定義了一個哈夫曼樹結(jié)點(diǎn):

class hNode
{
 public:
  friend bool operator > (hNode n1,hNode n2); //定義了大于符號,供優(yōu)先隊列排列使用
  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; //字符串出現(xiàn)的次數(shù)
};
bool operator >(hNode n1,hNode n2)
{
 return n1.value > n2.value;
}

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

while(...)
{
 std::priority_queue q;
 .....
 hNode h2 = q.top();
 q.pop();
 hNode h3 = q.top();
 q.pop();
 hNode r;
 r.left = h2;
 r.right = h3;
 r.value = h2.value + h3.value;
}

然而遭遇的第一個問題是,STL的所有容器的的插入都是基于by value語義的,也就是要生成一個對象的副本放在容器中。這樣的后果就是hNode的left,right指針都指到不知道什么地方去了。大家可以稍微畫幾個圖試一下,就知道出了什么問題了??紤]一下后,發(fā)現(xiàn)如果隊列里存放hNode的指針,就不會出現(xiàn)這個問題了,于是改寫成:

hNode* makeTree(priority_queue 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在判斷優(yōu)先關(guān)系的時候,直接比較指針的地址,而不是指針指向的對象的大小關(guān)系。而指針不是類,我沒辦法重寫指針的比較操作。程序陷入了困境之中。std::priority_queue默認(rèn)使用Greater<>模板來生成一個function object來對元素進(jìn)行比較,我試圖為Greater<>寫一個hNode*的特化版本來改變優(yōu)先隊列對hNode*的比較,然而也沒有成功。山重水復(fù)疑無路之時,突然想到為什么不直接為優(yōu)先隊列寫一個function object來替代Greater<>不就可以了嗎?趕快寫下如下代碼:

struct phNodeComp
{
 bool operator () (const hNode*& left,const hNode*& right) const
 {
  return left->value > right->value;
 }
};

然后把std::priority_queue的申明變?yōu)椋?/p>

priority_queue,phNodeComp > pq;

看完上述內(nèi)容,你們掌握c++中怎么實(shí)現(xiàn)一個哈希慢算法的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!


當(dāng)前名稱:c++中怎么實(shí)現(xiàn)一個哈希慢算法-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://weahome.cn/article/icohh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部