首页 > 怎么样实时地计算中位数?

怎么样实时地计算中位数?

开始 初始化数组为 ary=[ ] 然后不停地添加数据, 添加一个数据就实时地输出此时的中位数
当然可以每次添加一个数据都把原来的ary排序一遍,但当这个数组增加十万,百万的时候这样很低效, 除此以外,有没有其他办法?


分组储存可能会是个好办法
如果只是需要中位数的话,就可以用二分法处理一下可能会好一些


这是一个经典的算法问题,可以用一个大根堆和一个小根堆实现高效维护。

下面这段是拷贝来的(http://blog.sina.com.cn/s/blog_455b20c10...)

"问题陈述:有个需要动态更新(插入或删除)的数列L,现在需要随时获取到该数列的中位数,请设计相应的数据结构和算法。

算法:令L的中位数为m,用一个大顶堆存储数列L中不大于m的元素(即L按从小到大排列时的前半部分),用一个小顶堆存储数列L中不小于m的元素(即L按从小到大排列时的后半部分),其中这两个大小顶堆均不包含中位数m。每次往数列L插入新元素x时,若x<m,则将其插入大顶堆,否则插入小顶堆。若插入新元素后导致m不再是中位数(即两个堆的元素数目相差2个或2个以上),则将当前的中位数m插入到元素数量较少的那个堆中,然后令元素数量较多的那个堆的堆顶元素为新的中位数,并从该堆顶元素从堆中删除。

分析:容易看出,以上算法中,读取当前中位数的时间复杂度为O(1),插入和删除元素(包括调整堆)的时间复杂度为O(logN)。"

【热门文章】
【热门文章】