使用堆的方式獲取資料流中的中位數

2021-08-26 05:37:07 字數 1593 閱讀 7321

題目:設計乙個方法,要求這個方法可以不斷輸出乙個資料流中的中位數(資料流中的數字整型並且隨機)

思想:構建兩個小根堆,其中乙個小根堆儲存的資料相對較小(堆b),另外乙個小根堆儲存的資料較大(堆a),並且構建兩個變數,其中乙個儲存堆b的最大值,另乙個儲存堆a的最小值。每次接收乙個數字的時候,先與堆a中的最小值比較;如果這個數字大於堆a中的最小值,則儲存在堆a中。然後調整堆a和堆b中的資料量,使得他它們中的資料數目小於等於1。最後調整堆a為小根堆。如果這個資料小於堆a中最小值,則將這個資料儲存在堆b中,然後調整堆a和堆b中的資料量,使得他它們中的資料數目小於等於1。調整完之後,將堆b調整為小根堆,並且同步堆b的最大值。輸出:如果兩個堆中的資料量相等,則中位數就是堆a的最小值和堆b的最大值相加除以2,如果堆a的資料量多於堆b,則中位數就是堆a的最小值,如果堆b的資料量多於堆a,則中位數就是堆b的最大值。

public class medianrealtime  else 

//如果兩個堆中的資料數目相等,那麼中位數就是a堆的最小值與b堆的最大值除以2

if (max_heap.size() == min_heap.size()) else if (max_heap.size() > min_heap.size()) else

return minheap_max;

}/**

* 新加入乙個數之後,使得兩個堆的長度之差不超過1

* @param data

*/private void balancetwoheaps(int data)

//調整a堆為小根堆

heapsort(max_heap);

//如果後來進入的資料小於a堆的最小值,則將這個數放在b堆

} else

//調整完之後,將b堆調整為小根堆

heapsort(min_heap);

//並且同步b堆的最大值

minheap_max = min_heap.get(min_heap.size() - 1);}}

/*** 堆排序方法採用大根堆排序

* 首先構建大根堆,使得根元素為最大的,

* 堆排序時,將根元素與最後乙個元素進行交換,再對前n-1個元素進行堆排序

** @param list

* @return

*/private static listbuildmaxheap(listlist)

return list;

}private static void adjust(listlist, int k, int length) else

}list.set(k, tmp);

}private static void heapsort(listlist)

}}

這個方法空間複雜度相對來說比較高,因此有優化的地方可以降低空間複雜度。

優化後的總體思路:對於每個不同數字構造乙個節點。這個節點具有兩個成員屬性,其中乙個是value(資料),乙個是num(資料出現的次數)。每次接收乙個資料,原來是直接比較後儲存堆中,現在就是多了乙個步驟,需要首先查詢堆看是否已經存在關於這個資料的節點。還有一點,就是其實完全沒有必要將兩個堆中的資料量調整得非得相等,或者非得相差至多為1。可以適當地加大差值,只要求出中位數即可。

資料流中的中位數python 資料流中的中位數

python用的自己實現的最大和最小堆的class,getmedian需要加個引數,否則python版會報錯。coding utf 8 最小堆 class minheap def init self self.minheap def len self return len self.minheap ...

LeetCode 堆 資料流中的中位數

如何得到乙個資料流中的中位數?如果從資料流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從資料流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。例如,2,3,4 的中位數是 3 2,3 的中位數是 2 3 2 2.5 設計乙個支援以下兩種操作的資料結構 示例...

資料流中的演算法

資料流統計功能上線後,為51nod提公升使用者體驗做出了很大的貢獻。但是新問題隨之而來,夾克老爺還想知道在乙個視窗內,訪問次數最多使用者 即視窗內的眾數 如果有多個眾數,取使用者id最小的乙個。視窗的意思是乙個固定長度的區間!input 第一行為整數n,k。1 n 5 10 6,1 k 1000 n...