最大堆:堆頂的key是堆裡所有關鍵字中最大者;
最小堆:堆頂的key是堆裡所有關鍵字中最小者;
堆是一棵完全二叉樹,樹中結點的值總是不大於(即最小堆)或者不小於(即最大堆)其孩子結點的值,所以每乙個結點的子樹也是乙個堆。
根據最大堆和最小堆的思想,我們可以實現標準庫容器:優先佇列。
中位數:若奇數,則是中間位置的數字;若偶數,則是中間兩個數字的平均值。
因此,整個數字可以分為兩部分:一部分資料(小值堆)均比另一部分資料(大值堆)小。因此,將小值堆設定為最大堆,大值堆設定為最小堆,將數字平均分配到兩個堆中,獲取兩個堆中的最值即可實現。
每獲得乙個資料,先插入到最大堆中,然後將最大堆中的最大值插入到最小堆,就保證了最小堆中的所有數字大於最大堆的所有數字。
常用的兩種仿函式:公升序greater()
和降序less()
,
push_heap(_iter,_iter,_compare)
:其中_compare
:對應上面的兩種仿函式,其中greater是指樹越向下越大,即最小堆,同理另一種是大頂堆。
常用操作:對於vector而言,首先陣列push_back
插入元素,然後再呼叫push_heap
,它會使最後乙個元素插到合適位置;而pop_heap
之後pop_back
則會將堆頂元素(即容器的第乙個位置)和容器的最後乙個位置交換位置,隨後刪除這個原來堆頂那個最值元素。
class
solution
min.
push_back
(num)
;//將最小堆(大值堆)裡面填充最大值
push_heap
(min.
begin()
,min.
end(
),greater<
int>()
);}else
max.
push_back
(num)
;push_heap
(max.
begin()
,max.
end(
),less<
int>()
);}}
double
getmedian()
private
: vector<
int> min;
vector<
int> max;
};
在c++的stl種還有優先佇列這個介面卡,也可以如下操作:
class
solution
double
getmedian()
};
最大堆和最小堆
堆的定義是 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 實現最大堆和最小堆
堆是具有以下特性的完全二叉樹,每個結點的值都大於或等於其左右孩子結點的值,叫做最大堆 每個結點的值都小於或等於其左右孩子結點的值,叫做最小堆。vector int nums 1 如果使用nums構建最大堆 make heap nums.begin nums.end 或 make heap nums....