求中位数总结
今天在某个群中看到有人问在流式的数据中如何动态的维护中位数的方法,因为之前看到同学的一个问题,当时他没答出来。但是后来了解到类似top(k),last(k)需要用到最大堆,最小堆一样,中位数需要利用双堆维护一下。
先复习一下,如果是静态的数据求取中位数的方法有哪些呢?
(1)排序
(2)fink-k
这两种方法不太适合于流式的数据动态变更中位数,所以就引出了双堆求取中位数的策略:
算法如下:
1、初始化的时候设置两个变量分别记录两个堆【左堆和右堆】的元素的个数。
2、取第一个元素【d[0]】作为初始中位数m。
3、循环后面的每一个元素,如果比m大,则插入到右堆,如果比m小,则插入到左堆。
4、.如果此时最小堆和最大堆的元素个数的差值>=2 ,则将m加入到元素个数少的堆中,然后从元素个数多的堆将根节点赋值到m,最后重建两个最大堆和最小堆,返回到3。
此时,如果想要知道当前的中位数,输出m即可。
简单图解一下: