關於最小堆以及priority queue

2021-07-10 22:49:26 字數 1363 閱讀 7062

今天刷題用到了最小堆,想直接用stl庫去實現,無奈用得少,不太熟練,現在把剛學到的列在這兒。

最小堆(最大堆)可以有兩種實現方法:vector和priority_queue,不過兩種的底層實現是一樣的。

這裡主要是針對自定義的資料結構。

1. 兩種方法可以都過載《運算子來確定優先順序(注意:必須是「<」操作符)

直接上**:

#include#includeusing namespace std;

struct edge

edge(int _u,int _v, int _w):u(_u),v(_v),w(_w) {}

friend bool operator<(edge a,edge b)

};int main()

edge(int _u,int _v, int _w):u(_u),v(_v),w(_w) {}

friend bool operator<(edge a,edge b)

};int main()

edge(int _u,int _v, int _w):u(_u),v(_v),w(_w) {}

/*friend bool operator<(edge a,edge b) */

};struct cmp

};int main()

edge(int _u,int _v, int _w):u(_u),v(_v),w(_w) {}

};bool cmp(const edge &a,const edge &b)

int main()

{ vectorvec;

vec.push_back(edge(1,2,300));

vec.push_back(edge(3,2,20));

vec.push_back(edge(1,3,65));

vec.push_back(edge(1,2,22));

vec.push_back(edge(1,2,40));

vec.push_back(edge(1,2,100));

make_heap(vec.begin(),vec.end(),cmp);

//sort_heap(vec.begin(),vec.end(),cmp);

while (!vec.empty())

{ cout<

2. 很長時間沒有理解比較函式的工作原理(即大於號小於號到底怎麼選,到底a>b是最大堆還是最小堆),看了網上的部落格,可以這樣記憶比較函式的意義:a,b是資料結構的前後兩個元素,如果返回true,則兩個元素需要交換位置,反之則不需要。因此,我上面貼的**裡面a.w>b.w是生成的最小堆。

3. priority_queue預設用的比較方式是less(),產生最大堆,反之,仿函式為greater(),產生最小堆。

最小堆以及最小優先佇列的實現

build min heap的實現 最小堆從邏輯上可以理解為乙個完全二叉樹 如圖a所示 最小堆的性質很簡單,即除了根節點以外,所有的節點都要小於其左右子節點,而從物理儲存上看,它是由陣列的形式來儲存的 如圖b所示 最小堆可以應用於最小優先佇列的構建以及堆排序演算法的實現,後面我會繼續更新最小優先佇列...

最小堆及基於最小堆的最小優先佇列

最小堆具有的性質 最小堆的父親節點比子節點的值小 在最小堆的類中我們定義的函式主要有 維護最小堆 建立最小堆和利用最小堆進行排序 以下是最小堆的定義 ifndef my min heap h define my min heap h include includeusing namespace st...

最小堆建立

題目 實現最小堆兩個功能 1 增加乙個元素 2 輸出並刪除最小堆中的最小的數 輸入 第一行輸入乙個整數t,代表測試資料的組數。對於每組測試資料,第一行輸入乙個整數n,代表操作的次數。每次操作首先輸入乙個整數type。當type 1,增添操作,接著輸入乙個整數u,代表要插入的元素。當type 2,輸出...