資料流的中位數

2021-10-11 15:57:14 字數 973 閱讀 9966

資料流的中位數

中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。

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

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

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

示例:

addnum(1)

addnum(2)

findmedian() -> 1.5

addnum(3)

findmedian() -> 2

方法一:利用插入排序

插入排序能保證將元素新增到列表中還有序

可以用二分法定位到應該插入的位置,將其插入

中位數即為中間的乙個或兩個數

時間複雜度:o(n)

class medianfinder 

public void addnum(int num)

public int binarysearch(int target) else

}return low;

}public double findmedian() else

}}

方法二:兩個堆

乙個大根堆:存較小的數字,根頂為這部分最大的數字

乙個小根堆:存較大的數字,根頂為這部分最小的數字

只要保證兩個堆大小相同或相差1,可以直接從根頂得到中位數

如允許大根堆元素多1,獲取中位數時:

兩個堆平衡的保證:

大根堆更大, 將元素新增到小根堆中,調整方式:

時間複雜度:o(logn)

class medianfinder  else 

}public double findmedian() else

}}

資料流的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。coding utf ...

資料流的中位數

問題定義 不斷有數字過來,問在當前所有數字中的中位數是多少 優先佇列 堆 我們可以用乙個大根堆和乙個小根堆分別維護乙個有序數,使得小根堆的所有數字都大於大根堆,這就要求小根堆的堆頂要大於等於大根堆的堆頂。為了求得中位數,我們需要小根堆和大根堆的數字個數相等或相差一。我們可以用優先佇列實現如下 pri...

資料流中的中位數

資料流中的中位數 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。解題思路 維護乙個大堆和乙個小堆,大堆表示序列前一半數,小堆表示序列後一半數,保持兩個堆的元素個...