如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使用insert()方法讀取資料流,使用getmedian()方法獲取當前讀取資料的中位數。
原來想著直接用乙個vector裝載資料,然後每次排序取中位數。這樣作時間複雜度比較大,而且隨著資料增多,時間複雜度會越來越大。
在牛客網上看到用堆解決的方法。用兩個堆,乙個大頂堆用來存放資料流中較小的元素,乙個小頂堆用來存放較大的元素,兩個堆中的元素數量差不超過1(在這裡,當元素數量是奇數時,讓大頂堆多存放乙個元素)。這相當於,將目前所有資料排序,前半部分較小的元素存放在大頂堆中,後半部分較大的元素存放在小頂堆中,這樣兩個堆堆頂元素就是整個序列的中間元素。如果此時兩個堆元素數量相同,說明此時整個序列元素數量是偶數,取兩個堆的堆頂元素取平均為結果;如果大頂堆比小頂堆多乙個元素,說明此時整個序列元素數量是奇數,取大頂堆元素為結果。
c++中優先佇列就是用堆來實現的。
class
solution
if(pre.
size()
+1==post.
size()
)}double
getmedian()
};
資料流中的中位數
資料流中的中位數 如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。解題思路 維護乙個大堆和乙個小堆,大堆表示序列前一半數,小堆表示序列後一半數,保持兩個堆的元素個...
資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。class solution double getmedian else private vectordata c...
資料流中的中位數
如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。簡單題 找中位數 coding utf 8 class solution x def insert self,nu...