LeetCode 堆 資料流中的中位數

2022-08-20 08:36:08 字數 2373 閱讀 2191

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。

例如,[2,3,4] 的中位數是 3

[2,3] 的中位數是 (2 + 3) / 2 = 2.5

設計乙個支援以下兩種操作的資料結構:

示例:

輸入:

["medianfinder","addnum","addnum","findmedian","addnum","findmedian"]

[,[1],[2],,[3],]

輸出:[null,null,null,1.50000,null,2.00000]

輸入:["medianfinder","addnum","findmedian","addnum","findmedian"]

[,[2],,[3],]

輸出:[null,null,2.00000,null,2.50000]

使用堆來做。我們設定兩個堆:minheap 為小根堆,maxheap 為大根堆。小根堆儲存資料中較大的一半,大根堆儲存資料中較小的一半。這樣,小根堆和大根堆的堆頂元素就是資料流中間的兩個元素。保持 minheap.size()==maxheap.size() 或者 minheap.size()==maxheap.size()+1,也就是小根堆的大小和大根堆的大小一樣大或者小根堆的大小比大根堆大一。

為什麼小根堆的大小要和大根堆的大小相等或者比大根堆大一呢?因為當資料流中的資料為偶數個時,小根堆和大根堆的元素個數是相等的,此時的中位數就是小根堆堆頂和大根堆堆頂的平均值。例如,資料流為 [1,2,3,4],則小根堆元素為 [3,4],堆頂為 3;大根堆元素為 [1,2],堆頂為 2,所以中位數為 (2+3)/2=2.5。當資料流中的元素為奇數個時,小根堆的大小比大根堆的大小大一可以保證小根堆的堆頂元素為中位數。例如,資料流為 [1,2,3,4,5],則小根堆的元素為 [3,4,5],堆頂為 3,大根堆元素為 [1,2],堆頂為 2,中位數為 3。總而言之,這樣的堆大小設定僅僅是為了在資料流中資料為奇數個時,我們總是從小根堆裡取中位數。其實也可以反過來將大根堆的大小設定為和小根堆相等或者比小根堆的大小大一,**只有一點點不同。

當小根堆的大小和大根堆的大小相等或者比大根堆大一時的操作如下:

插入元素:

否則,兩個堆尺寸不等:

為什麼要這麼插入呢?因為我們要保持兩個堆的堆頂元素是處於資料中間且距離最近的兩個有序元素。

獲取中位數:

**如下:

小根堆大小和大根堆大小相等或者比大根堆的大小大一:

class medianfinder 

void addnum(int num) else

}double findmedian()

private:

priority_queue, greater> minheap; // 小根堆

priority_queue, less> maxheap; // 大根堆

};/**

* your medianfinder object will be instantiated and called as such:

* medianfinder* obj = new medianfinder();

* obj->addnum(num);

* double param_2 = obj->findmedian();

*/

大根堆大小和小根堆大小相等或者比小根堆的大小大一:

class medianfinder 

void addnum(int num) else

}double findmedian()

private:

priority_queue, greater> minheap; // 小根堆

priority_queue, less> maxheap; // 大根堆

};/**

* your medianfinder object will be instantiated and called as such:

* medianfinder* obj = new medianfinder();

* obj->addnum(num);

* double param_2 = obj->findmedian();

*/

solution/mian-shi-ti-41-shu-ju-liu-zhong-de-zhong-wei-shu-y/

資料流中的中位數python 資料流中的中位數

python用的自己實現的最大和最小堆的class,getmedian需要加個引數,否則python版會報錯。coding utf 8 最小堆 class minheap def init self self.minheap def len self return len self.minheap ...

資料流中的演算法

資料流統計功能上線後,為51nod提公升使用者體驗做出了很大的貢獻。但是新問題隨之而來,夾克老爺還想知道在乙個視窗內,訪問次數最多使用者 即視窗內的眾數 如果有多個眾數,取使用者id最小的乙個。視窗的意思是乙個固定長度的區間!input 第一行為整數n,k。1 n 5 10 6,1 k 1000 n...

資料流中的中位數(大頂堆和小頂堆)

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 vo...