優先佇列的出隊順序是按照優先順序來的,可以找到最小或者最大元素,同時支援插入或者刪除最小最大元素。
優先佇列的格式:
priority_queue
t:佇列中元素的資料型別
container: 用於儲存和訪問佇列元素的底層容器的型別。
compare: 比較關係,預設是數值上的小於關係(return a優先佇列支援的操作如下:
(1)priority_queue::empty()
判斷佇列是否為空(也即是size是否為0),是則返回true,否則返回false。
(2)priority_queue::size()
返回佇列中元素的個數。這個函式也可以用於判斷佇列是否為空。
(3)priority_queue::top()
返回隊頭元素的常引用,隊頭元素是在所設定的比較關係下最大也即優先順序最高的元素。此函式實際上呼叫底層容器的front函式。
(4)priority_queue::pop()
清除隊頭元素。
(5)priority_queue::push(data)
給佇列插入元素,新元素會按其優先順序被排列到適當位置。
struct cmp};
priority_queue
,cmp> q;
優先佇列相關題目
求中位數
dynamic median
ac**:
#include
#include
#include
#include
using
namespace std;
priority_queue<
int, vector<
int>
, less<
int>> que1;
//最大堆
priority_queue<
int, vector<
int>
, greater<
int>> que2;
//最小堆
void
insert
(int num)
else
if(que1.
size()
-2== que2.
size()
)if(que1.
size()
+1== que2.
size()
)}void
query()
void
del()}
void
clear()
intmain
(int argc,
const
char
* ar**)
if(c ==
'd')
del();
if(c ==
'q')
query()
;}}return0;
}
合併k個鍊錶
題目描述:
合併k個排序鍊錶,返回合併後的排序鍊錶
示例:輸入:
1->4->5,
1->3->4,
2->6
輸出:1->1->2->3->4->4->5->6
思路:利用最小堆,首先把k個鍊錶的首元素都加入到最小堆中,它們會自動排好序,然後每次取出最小的元素加入到最終結果的鍊錶中,之後把取出元素的下乙個元素加入到堆中,直到堆中沒有元素。
struct listnode
;listnode*
merge
(vector> lists)
listnode *head =
null
,*temp =
null
,*pre =
null
;while
(!que.
empty()
)return head;
}
找出第k大的元素
例如:12345,第2大的元素是4
思路:構建乙個size為k的最小堆,每次進入堆的時候和棧頂的元素進行比較,
int
find
(int n,
int k)
else}}
return que.
top();
}
更多題目詳見優先佇列與堆 資料結構與演算法 複習 堆 優先佇列
插入演算法 該演算法從優先佇列的序列去觀察,比較直觀。首先把要插入的元素放在隊尾temp裡。從佇列的最後乙個元素,逐次向前尋找父節點,空位隨之移動,當到達隊頭,或者當前元素小於temp元素時,即可插入。刪除演算法 刪除最小元素,也就是最頭的元素。當我們利用 當前元素數量 1 這樣的操作刪除元素後,最...
演算法課程期末複習總結
八大排序演算法複雜度比較 求解遞迴式的複雜度 max sum 最大子段和 int len arr.length int dp newint len 1 dp 0 0 for int i 1 i len i int res integer.min value for int i 1 i dp.leng...
演算法之優先佇列
1 概念 優先順序佇列,顧名思義,就是一種根據一定優先順序儲存和取出資料的佇列。它可以說是佇列和排序的完美結合體,不僅可以儲存資料,還可以將這些資料按照我們設定的規則進行排序。優先順序佇列是堆的一種常見應用。有最大優先順序佇列 最大堆 和最小優先順序佇列 最小堆 優先順序佇列是一種維護有一組元素構成...