劍指offer 面試題41 數據流中的中位數

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

實現:我們使用Insert()方法讀取數據流,使用GetMedian()方法獲取當前讀取數據的中位數。

思路:

將數據分兩個容器存放,左邊容器最大堆,右邊容器最小堆,中位數爲最大堆的堆頂元素和最小堆的堆頂元素的和的1/2。

插入時,要滿足兩邊容器元素之差不能大於1.同時,要滿足右邊容器元素都大於左邊容器。

例如,元素按照規律要被插在右邊,但是它比左邊一些元素小,這時,把它插在左邊,同時取出左邊堆頂,插入右邊。

複雜度分析:插入時間複雜度O(logn),得到中位數的時間複雜度爲O(1),空間複雜度爲O(n).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章