
AcWing 54 数据流中的中位数
数据流的中位数问题
发布日期:2021-05-28 16:30:42
浏览次数:23
分类:精选文章
本文共 1064 字,大约阅读时间需要 3 分钟。
如何得到一个数据流中的中位数
在处理数据流中的中位数问题时,可以通过维护两个堆来高效地实现。以下是详细的解决方案。
- 奇数个数据:排序后取中间的数值。
- 偶数个数据:排序后取中间两个数的平均值。
高效算法方案一种常用的方法是使用两个堆来分别存储较小和较大的数,将它们保持在接近相等大小的状态。这种方法的时间复杂度为O(log n),非常适合处理大规模数据流。
数据结构选择
- 大根堆(max-heap):存储较小的一部分数。
- 小根堆(min-heap):存储较大的另一部分数。
插入操作a. 插入新数值到大根堆。b. 比较大根堆和小根堆的顶元素,调整堆的顺序。c. 当大根堆比小根堆多两个元素时,取出大根堆的顶元素,插入到小根堆中。
获取中位数
- 如果双方元素数量相等,返回两堆顶元素的平均值。
- 否则,直接返回大根堆的顶元素。
- 插入函数:将新数插入大根堆,然后调整堆的顺序以维持两个堆的关系。
- 取中位函数:判断两堆大小相同则返回平均值,否则返回大根堆顶元素。
具体实现使用C++的优先队列<队列>模拟两堆结构。实现如下:
class Solution {public:priority_queue<int,vector
> maxh; // 大根堆priority_queue<int,vector > minh; // 小根堆void insert(int num) { maxh.push(num); if (!minh.empty() && maxh.top() > minh.top()) { int x = maxh.top(), y = minh.top(); maxh.pop(); minh.pop(); maxh.push(y); minh.push(x); } if (maxh.size() == minh.size() + 2) { int x = maxh.top(); maxh.pop(); minh.push(x); }}double getMedian() { if (maxh.size() == minh.size()) return (maxh.top() + minh.top()) / 2.0; return maxh.top();}
}
代码解释:
通过这种方法,可以高效地处理数据流中的中位数问题。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月10日 04时17分55秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Hbase压力测试
2019-03-14
StreamReader & StreamWriter
2019-03-14
C#中的类、方法和属性
2019-03-14
Python爬取清朝末年医书:《醉花窗医案》,看看病症情况
2019-03-14
Python爬虫训练:爬取酷燃网视频数据
2019-03-14
Python数据分析入门(十九):绘制散点图
2019-03-14
大佬谈接口自动化,我是这样做测试框架开发的……
2019-03-14
C++版浙大PAT乙级1069(20分)测试点3答案错误解决方法
2019-03-14
hive内部错误
2019-03-14
Error:scalac: bad option: '-make:transitive'
2019-03-14
微软xp壁纸rgb
2019-03-14
浏览器刷新页面
2019-03-14
代码错误信息,微信报错
2019-03-14
easyui日期处理(开始时间和结束时间)
2019-03-14
java文件上传
2019-03-14
Callable中call方法和Runnable中run方法的区别
2019-03-14
【蓝桥杯】 java 大学c组 省赛 1、隔行变色
2019-03-14
超市账单管理系统
2019-03-14
Springboot实现热部署
2019-03-14