堆的應用

第一個是ali的面試題:

第一題是本週淘寶上有5億個商品成交數據,讓你找出銷量最高的10000個商品

直接想起來優先隊列也就是堆。從而引出堆的一個重要的應用------大數據


【適用範圍】
海量數據前n大,並且n比較小,堆可以放入內存


基本原理及要點:最大堆求前n小,最小堆求前n大。方法,比如求前n小,我們比較當前元素與最大堆裏的最大元素,如果它小於最大元素,則應該替換那個最大元素。這樣最後得到的n個元素就是最小的n個。適合大數據量,求前n小,n的大小比較小的情況,這樣可以掃描一遍即可得到所有的前n元素,效率很高。(爲什麼說使用堆效率很高,一般的優先隊列效率比較低麼?進行對比分析,。見《數據結構》P125)



第二題:題目介紹:

輸入爲不斷地數字流,實時顯示出當前已經輸入的數字序列的中位數


雙堆,一個最大堆與一個最小堆結合,可以用來維護中位數。


解答:

求中位數的方法很多,對於大數據量最經典是桶的計數方法,但是對於這個問題不適用,因爲數據是不斷變化的

可以用最大堆和最小堆來解答這個問題:

1.假設當前的中位數爲m,其中最大堆維護的是<=m的數字序列,最小堆維護的是>=m的數字序列,但是兩個堆都不包含m

2.當新的數字到達時,比如爲a,將a與m進行比較,若a<=m 則將其加入到最大堆中,否則將其加入到最小堆中

3.如果此時最小堆和最大堆的元素個數的差值>=2 ,則將m加入到元素個數少的堆中,然後從元素個數多的堆將根節點賦值到m,最後重建兩個最大堆和最小堆,返回到2(複雜度爲建堆的複雜度O(nlogn))




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章