最大堆和最小堆思想的應用 資料流中的中位數問題

2021-09-29 03:04:45 字數 1402 閱讀 8986

最大堆:堆頂的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....