41 資料流中的中位數

2021-10-05 11:35:35 字數 1290 閱讀 7569

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用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...