动态维护数列的中位数
来源:互联网 发布:mysql 索引覆盖 编辑:程序博客网 时间:2024/06/05 20:05
转自 http://blog.sina.com.cn/s/blog_455b20c10100fmmb.html
问题陈述:有个需要动态更新(插入或删除)的数列L,现在需要随时获取到该数列的中位数,请设计相应的数据结构和算法。
算法:令L的中位数为m,用一个大顶堆存储数列L中不大于m的元素(即L按从小到大排列时的前半部分),用一个小顶堆存储数列L中不小于m的元素(即L按从小到大排列时的后半部分),其中这两个大小顶堆均不包含中位数m。每次往数列L插入新元素x时,若x<m,则将其插入大顶堆,否则插入小顶堆。若插入新元素后导致m不再是中位数(即两个堆的元素数目相差2个或2个以上),则将当前的中位数m插入到元素数量较少的那个堆中,然后令元素数量较多的那个堆的堆顶元素为新的中位数,并从该堆顶元素从堆中删除。
分析:容易看出,以上算法中,读取当前中位数的时间复杂度为O(1),插入和删除元素(包括调整堆)的时间复杂度为O(logN)。
发散:上述算法可以推广到解决维护数列的第k大(小)数的问题,只需要修改大、小顶堆的元素数目即可。
0 0
- 动态维护数列的中位数
- 动态维护数列的中位数
- 动态维护中位数
- 用堆维护数组的中位数
- 两组有序数列的中位数
- POJ 3784 对顶堆动态维护中位数 解题报告
- 维护数列
- 维护数列
- 如何维护一个中位数
- 斐波纳契数列 线段树的维护
- BZOJ 1500([NOI2005]维修数列-Splay的数列维护)
- POJ3784 Running Median 对顶堆维护动态中位数(思维)
- 双堆维护数组中位数
- 双堆维护数组中位数
- 算法 双堆维护中位数
- 中位数的中位数
- 【noi2005】维护数列
- [NOI2005] 维护数列 sequence
- 数据结构:树
- Mac Android Studio SVN
- 使用 C# 开发智能手机软件:推箱子(十四)
- 海贼王之伟大航路解题报告
- java中的关键字super
- 动态维护数列的中位数
- HttpClient和HttpURLConnection的区别
- Android四大组件之activity
- 深入浅出CChart 每日一课——快乐高四第八课 懵懂的童年,返璞归真之Duilib窗口多区域绘图
- Kafka文件存储机制
- Web前端框架之图片轮播
- CSS 中 px,em和rem 的区别 学习笔记
- Docker学习2 - Docker图形用户界面
- 普通dos编码文件批量转换为UTF-8格式文件