程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ priority_queue 最大堆、最小堆

C++ priority_queue 最大堆、最小堆

編輯:C++入門知識

C++ priority_queue 最大堆、最小堆


問題描述

通常在刷題的時候,會遇到最大堆、最小堆的問題,這個時候如果自己去實現一個也是OK的,但是通常時間不太夠,那麼如何處理?這時,就可以借助C++ STL的priority_queue。

具體分析

需要注意的是,C++ STL默認的priority_queue是將優先級最大的放在隊列最前面,也即是最大堆。那麼如何實現最小堆呢?

假設有如下一個struct:

struct Node {
    int value;
    int idx;
    Node (int v, int i): value(v), idx(i) {}
    friend bool operator < (const struct Node &n1, const struct Node &n2) ; 
};

inline bool operator < (const struct Node &n1, const struct Node &n2) {
    return n1.value < n2.value;
}

priority_queue pq; // 此時pq為最大堆

如果需要最大堆,則需要如下實現:

struct Node {
    int value;
    int idx;
    Node (int v, int i): value(v), idx(i) {}
//  friend bool operator < (const struct Node &n1, const struct Node &n2) ;
    friend bool operator > (const struct Node &n1, const struct Node &n2) ;
}; 

inline bool operator > (const struct Node &n1, const struct Node &n2) {
    return n1.value > n2.value;
}

priority_queue, greater > pq; // 此時greater會調用 > 方法來確認Node的順序,此時pq是最小堆

其他解決

當然,還有些比較小的較為hack的手段進行。比如要構造一個int類型的最小堆:

priority_queue pq; // 
pq.push( -1 * v1) ; //
pq.push( -1 * v2) ; //
pq.push( -1 * v3) ; // 分別是插入v1, v2, v3變量的相反數,那麼pq其實也就變相成為了最小堆,只是每次從pq取值後,要再次乘以-1即可

 

struct node{
  int idx;
  int key;
  node(int a=0, int b=0):idx(a), key(b){}
};

struct cmp{
  bool operator()(node a, node b){
    return a.key > b.key;
  }
}; 
priority_queue, cmp> q;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved