問題:如何得到一個數據流中的中位數?如果從數據流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從數據流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。
實現:我們使用Insert()方法讀取數據流,使用GetMedian()方法獲取當前讀取數據的中位數。
思路:
將數據分兩個容器存放,左邊容器最大堆,右邊容器最小堆,中位數爲最大堆的堆頂元素和最小堆的堆頂元素的和的1/2。
插入時,要滿足兩邊容器元素之差不能大於1.同時,要滿足右邊容器元素都大於左邊容器。
例如,元素按照規律要被插在右邊,但是它比左邊一些元素小,這時,把它插在左邊,同時取出左邊堆頂,插入右邊。
複雜度分析:插入時間複雜度O(logn),得到中位數的時間複雜度爲O(1),空間複雜度爲O(n).