剑指offer 数据流中的中位数
来源:互联网 发布:如何做好旅游网络推广 编辑:程序博客网 时间:2024/05/17 06:49
1.题目
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
要求:时间复杂度不超过O(n)
2.分析
最大堆:根结点的值最大,每个节点的值都比子节点大
最小堆:根结点的值最小,每个节点的值都比子节点小
将数据分成两部分,一部分位于中位数左边,一部分位于右边
用最大堆实现左边的数据,最小堆实现右边的数据。
那么
插入数据的复杂度为O(logn)
获取堆顶元素的复杂度为O(1)
细节:
1)两个堆中数据的个数之差不能超过1
2)数据总数为偶数时,把新数据插入最小堆,然后把最小堆中最小的数拿出来插入最大堆;
总数为奇数,新的数据,先插入最大堆,然后把最大堆中最大数拿出来插入最小堆
中位数:
总数为偶数,(最大堆堆顶+最小堆堆顶)/2
总数为奇数,最大堆堆顶
3.实现
STL实现最大堆,最小堆
priority_queue默认是最大堆。
如果自定义比较函数 a<b 是最大堆 a>b是最小堆。
priority_queue<int, vector<int>, less<int>> maxHeap;priority_queue<int, vector<int>, greater<int>> minHeap;
注意:我在vs2015中提示greater不是模板,需要加上头文件#include<functional>
也可以自定义比较函数
struct cmp{ bool operator()(const int &a, const int &b) { return a > b; }};priority_queue<int, vector<int>, cmp> minHeap;
中位数的实现
class Median { priority_queue<int, vector<int>, less<int>> maxHeap; priority_queue<int, vector<int>, greater<int>> minHeap;public: void add(int x) { if ((maxHeap.size() + minHeap.size()) % 2 == 1)//偶数,数据插入最小堆 { maxHeap.push(x); minHeap.push(maxHeap.top()); maxHeap.pop(); } else {//奇数,数据插入最大堆 minHeap.push(x); maxHeap.push(minHeap.top()); minHeap.pop(); } } int getMedian() { return (maxHeap.size() + minHeap.size()) % 2 == 0 ? (maxHeap.top() + minHeap.top()) / 2 : maxHeap.top(); }};
阅读全文
0 0
- 剑指offer--数据流中的中位数
- 《剑指offer》数据流中的中位数
- 剑指offer:数据流中的中位数
- 剑指offer-数据流中的中位数
- 剑指offer 数据流中的中位数
- 《剑指offer》数据流中的中位数
- 剑指Offer:数据流中的中位数
- 剑指offer-数据流中的中位数
- 剑指offer 数据流中的中位数
- 剑指offer 64-数据流中的中位数
- 剑指offer—数据流中的中位数
- 剑指offer(六十三)之数据流中的中位数
- 剑指offer——数据流中的中位数
- 《剑指offer》:[64]数据流中的中位数
- 剑指offer(60)-数据流中的中位数
- 剑指Offer--064-数据流中的中位数
- 剑指offer-63.数据流中的中位数
- 【剑指offer】题64:数据流中的中位数
- C语言——关机小程序
- 面向对象思想
- 协程的好处有哪些?
- 进制和进制的转换
- java 的数据库驱动加载过程
- 剑指offer 数据流中的中位数
- Java中interface和@interface的区别
- 2018网易校招运营开发工程师编程第一题
- 第十一章 缓存机制(六) 概述
- poj1463 Strategic game 树形dp
- Spring MVC学习指南(5-7章总结)
- CentOS下Maven的安装
- 深度学习Caffe
- Spark +hadoop 完全分布式搭建 以及常见问题