动态维护数列的中位数
来源:互联网 发布:如何防范sql注入式攻击 编辑:程序博客网 时间:2024/06/03 12:28
问题陈述:有个需要动态更新(插入或删除)的数列L,现在需要随时获取到该数列的中位数,请设计相应的数据结构和算法。
算法:令L的中位数为m,用一个大顶堆存储数列L中不大于m的元素(即L按从小到大排列时的前半部分),用一个小顶堆存储数列L中不小于m的元素(即L按从小到大排列时的后半部分),其中这两个大小顶堆均不包含中位数m。每次往数列L插入新元素x时,若x<m,则将其插入大顶堆,否则插入小顶堆。若插入新元素后导致m不再是中位数(即两个堆的元素数目相差2个或2个以上),则将当前的中位数m插入到元素数量较少的那个堆中,然后令元素数量较多的那个堆的堆顶元素为新的中位数,并从该堆顶元素从堆中删除。
分析:容易看出,以上算法中,读取当前中位数的时间复杂度为O(1),插入和删除元素(包括调整堆)的时间复杂度为O(logN)。
发散:上述算法可以推广到解决维护数列的第k大(小)数的问题,只需要修改大、小顶堆的元素数目即可。
from:http://blog.sina.com.cn/s/blog_455b20c10100fmmb.html
0 0
- 动态维护数列的中位数
- 动态维护数列的中位数
- 动态维护中位数
- 用堆维护数组的中位数
- 两组有序数列的中位数
- POJ 3784 对顶堆动态维护中位数 解题报告
- 维护数列
- 维护数列
- 如何维护一个中位数
- 斐波纳契数列 线段树的维护
- BZOJ 1500([NOI2005]维修数列-Splay的数列维护)
- POJ3784 Running Median 对顶堆维护动态中位数(思维)
- 双堆维护数组中位数
- 双堆维护数组中位数
- 算法 双堆维护中位数
- 中位数的中位数
- 【noi2005】维护数列
- [NOI2005] 维护数列 sequence
- Exchange 2010 PS 之 Get-MessageTracking命令!
- HOJ 1020
- 【笔记】投影坐标到屏幕坐标
- SICP 习题2.21 square-list
- 文章标题
- 动态维护数列的中位数
- 进程、线程和协程的区别是什么
- 在jsp中设置cookie
- PHP对表单提交特殊字符的过滤和处理
- test
- 如何在OS X El Captain中配置GLFW和GLEW
- 面向对象设计方式的特性
- python爬虫之爬取网页
- MyBatis动态SQL