如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert()方法讀取資料流,使用getmedian()方法獲取當前讀取資料的中位數。
從資料流中讀到數字,有多中資料結構儲存,所以對應多種解決方法,有不同的時間複雜度。
資料結構插入的時間複雜度得到中位數的時間複雜度
沒有排序的陣列
o(1)
o(n)
排序的陣列
o(n)
o(1)
排序的鍊錶
o(n)
o(1)(定義兩個指標指向中間結點)
二叉搜尋樹
平均o(logn)
最差o(n)
平均o(logn)(二叉樹結點中定義字段表示子結點數目)
最差o(n)
alv樹
o(logn)(插入**南書寫)
o(1)(將平衡因子改為左右子樹結點數目差)
最大堆和最小堆
o(logn)
o(1)
若資料流有序,均分後,左邊部分總小於右邊部分,左半部分的最大值,與右半部分的最小值的平均即為中位數。(偶數個的情況)
如果能保證左邊部分資料都小於右邊部分的資料,即使左、右部分內資料沒有排序,仍能根據左邊的最大值和右邊的最小值得到中位數。
為了快速獲得兩部分的最值,選擇用堆這一資料結構實現,將資料均分,左邊存入最大堆,右邊存入最小堆。如何解決:
(1)資料如何均分存在最大堆和最小堆中?
當當前資料為偶數個時,存入最小堆中,若為奇數個,存在最大堆中。
(2) 如何保證最大堆中的所有數字都小於最小堆中的?
若向最大堆中插入數字:先將數字插入最小堆中,然後將最小堆堆頂數字(總小於所有)插入到最大堆中
c++實現
class solution
else
}double getmedian()
private:
priority_queue, less> max;//降序,大頂堆,存資料流左半部分
priority_queue, greater> min;//公升序,小頂堆,存資料流右半部分
int count = 0;//記錄讀取的數字的個數
};
41題資料流中的中位數
題目描述 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert 方法讀取資料流,使用getmedian 方法獲取當前讀取資料的中位數。思路 使用最...
資料流中的中位數
資料流中的中位數 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。解題思路 維護乙個大堆和乙個小堆,大堆表示序列前一半數,小堆表示序列後一半數,保持兩個堆的元素個...
資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。class solution double getmedian else private vectordata c...