資料流中的中位數 C 實現

2021-10-09 16:44:18 字數 1121 閱讀 8675

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert()方法讀取資料流,使用getmedian()方法獲取當前讀取資料的中位數。

牛客網題目鏈結

如題,中位數是指將一組數排序後處於中間位置的數

因此,我們首先能想到的是排序的做法,然而,這種做法的複雜度較高,為此,這裡介紹一種複雜度較低的解法。

中位數左邊的數都比中位數小,中位數右邊的數都比中位數大,我們引入兩個堆,中位數左邊的數用最大堆儲存,中位數右邊的數用最小堆儲存

注意,為了保證找到中位數,兩個堆中的元素個數相差不能超過1

操作方法為:

即:中位數右邊的最小值比中位數左邊的最大值還要大(這也正是我們所期望的)

考慮到實現堆的不便性,我們呼叫庫函式來解決我們的問題,放了方便理解,這裡交代幾個函式先:

以上函式中引數less表示最大堆,greater表示最小堆

class

solution

min.

push_back

(num)

;push_heap

(min.

begin()

,min.

end(

),greater<

int>()

);}else

max.

push_back

(num)

;push_heap

(max.

begin()

,max.

end(

),less<

int>()

);}}

double

getmedian()

private

: vector <

int> min;

vector <

int> max;

};

占用記憶體:448k

資料流中的中位數

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

資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。class solution double getmedian else private vectordata c...

資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。簡單題 找中位數 coding utf 8 class solution x def insert self,nu...