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