中位数求解
轉自:http://yaronspace.cn/blog/archives/1306
題目介紹:
輸入為不斷地數字流,實時顯示出當前已經輸入的數字序列的中位數
解答:
求中位數的方法很多,對于大數據量最經典是桶的計數方法,但是對于這個問題不適用,因為數據是不斷變化的
可以用最大堆和最小堆來解答這個問題:
1.假設當前的中位數為m,其中最大堆維護的是<=m的數字序列,最小堆維護的是>=m的數字序列,但是兩個堆都不包含m
2.當新的數字到達時,比如為a,將a與m進行比較,若a<=m 則將其加入到最大堆中,否則將其加入到最小堆中
3.如果此時最小堆和最大堆的元素個數的差值>=2 ,則將m加入到元素個數少的堆中,然后從元素個數多的堆將根節點賦值到m,最后重建兩個最大堆和最小堆,返回到2
還有一種方法,就是用桶劃分算法
總結