堆是具有以下特性的完全二叉樹,每個結點的值都大於或等於其左右孩子結點的值,叫做最大堆;每個結點的值都小於或等於其左右孩子結點的值,叫做最小堆。
vector<
int> nums =
;
1、如果使用nums構建最大堆:
make_heap
(nums.
begin()
, nums.
end())
;//或
make_heap
(nums.
begin()
, nums.
end(
), less<
int>()
);
輸出nums的結果為
//最大堆是按照層序遍歷的順序存入vector的98
2670
1435
2、如果使用nums構建最小堆:
make_heap
(nums.
begin()
, nums.
end(
), greater<
int>()
);
輸出nums的結果為
031
4529
867
當使用上述的make_heap()建完堆後,如果vector使用push_back()插入資料或pop_back()刪除資料後,會破壞最大堆/最小堆的性質,所以需要調整堆,常用push_heap()和pop_heap()兩個方法
1、push_heap()用法是,vector先push_back(),後push_heap():
nums.
push_back(10
);push_heap
(nums.
begin()
, nums.
end(
), less<
int>()
);
輸出nums的結果:
//原vector 98
2670
1435
//push_back()後98
2670
1435
10//push_heap()後109
2680
1435
7
2、pop_heap()用法是,先pop_heap(),vector後pop_back():
pop_heap
(nums.
begin()
, nums.
end(
), less<
int>()
);nums.
pop_back()
;
輸出nums的結果:
//原vector98
2670
1435
//pop_heap()後87
2650
1439
//pop_back()後87
2650
143
為什麼pop_heap()的用法要反過來呢?
要從我們的目的來考慮,使用pop_heap()的絕大部分目的是要把堆頂元素pop出堆中,因為它最大或最小。如果先用vector的pop_back(),它刪除的不是堆頂元素(nums[0]),而是vector的最後乙個元素。可見這不是我們想要的結果:對於最大堆,最後乙個元素既不是最大,也不一定是最小;對於最小堆,最後乙個元素既不是最小,也不一定是最大。pop出來沒有意義。
觀察pop_heap()對堆做了什麼?
pop_heap()把堆頂元素放到了最後一位,然後對它前面的數字重建了堆。這樣一來只要再使用pop_back()把最後一位元素刪除,就得到了新的堆。
priority_queue
對於這個模板類priority_queue,它是stl所提供的乙個非常有效的容器。
作為佇列的乙個延伸,優先佇列包含在標頭檔案中。
優先佇列時一種比較重要的資料結構,它是有二項佇列編寫而成的,可以以o(log n)的效率查詢乙個佇列中的最大值或者最小值,其中是最大值還是最小值是根據建立的優先佇列的性質來決定的。
優先佇列有三個引數,其宣告形式為:
priority_queue< type, container, function >
這三個引數,後面兩個可以省略,第乙個不可以。
其中:type:資料型別;
container:實現優先佇列的底層容器;
function:元素之間的比較方式;
對於container,要求必須是陣列形式實現的容器,例如vector、deque,而不能使list。
在stl中,預設情況下(不加後面兩個引數)是以vector為容器,以operator<為比較方式,所以在只使用第乙個引數時,優先佇列預設是乙個最大堆,每次輸出的堆頂元素是此時堆中的最大元素。
假設type型別為int,則:
bool empty() const
返回值為true,說明隊列為空;
int size() const
返回優先佇列中元素的數量;
void pop()
刪除佇列頂部的元素,也即根節點
int top()
返回佇列中的頂部元素,但不刪除該元素;
void push(int arg)
將元素arg插入到佇列之中;
//構造乙個空的優先佇列(此優先佇列預設為大頂堆)
priority_queue<
int> big_heap;
//另一種構建大頂堆的方法
priority_queue<
int,vector<
int>
,less<
int>
> big_heap2;
//構造乙個空的優先佇列,此優先佇列是乙個小頂堆
//如果是自己寫第三個引數,應該用「>」
priority_queue<
int,vector<
int>
,greater<
int>
> small_heap;
需要注意的是,如果使用less
和less
,需要標頭檔案:
#include
c++中priority_queue理解與使用
最大堆和最小堆
堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...
最大堆和最小堆
最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者,且每個結點的值都比其孩子的值大。最小堆 根結點的鍵值是所有堆結點鍵值中最小者,且每個結點的值都比其孩子的值小。最小堆和最大堆的增刪改相似,其實就是把演算法中的大於改為小於,把小於改為大於。生成最大堆 最大堆通常都是一棵完...
最小堆 最大堆的實現 c
最小堆 templateclass minheap int size const t min minheap insert const t x minheap deletemin t x void initialize t a,int size,int arraysize void deactiva...