第一個是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))