剑指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();    }};
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 狗狗得了尿结石怎么办 生理期第四天必须游泳怎么办 碎石后吐的厉害怎么办 白细胞高红细胞高血尿怎么办? 早期肾癌术后复发该怎么办 肾结石因运动引起尿血怎么办 宝宝大便镜检阳性潜血怎么办 尿不尽刺痛带血怎么办 狗狗拉肚子拉血怎么办 肾血肿怎么办才吸收快 体检尿蛋白高3怎么办 肾炎会引起脸肿怎么办 12小孩尿蛋白3是怎么办 肝癌介入手术后肝功能不好怎么办 屁多且臭便秘怎么办 肝癌术1年后复发怎么办 怀孕便秘怎么办或大便太干拉不出 肠鸣便秘怎么办多尿 奥司他韦过量怎么办 憋的时间长尿痛怎么办 手过敏了怎么办最简单 肾结石不痛但是有血尿怎么办 儿童医院血液科挂不到号怎么办 搬完重物手抖怎么办 弯腰搬重物腰疼怎么办 搬了重物后腰疼怎么办 例假不走公务员体检血尿怎么办 憋尿久了尿不出来怎么办 憋尿引起的总有尿意怎么办 如果孕妇憋尿了怎么办 孕妇憋尿半个月怎么办 尿憋久了排空后膀胱疼怎么办 胸疼肚子疼不规则流血怎么办 上小便下面会痛怎么办 两岁宝贝憋尿怎么办 打激素脸胖了怎么办 医生写的病历看不懂怎么办 怀孕尿蛋白3个加怎么办 两周岁宝宝牙齿坏掉怎么办 前列缐炎引起尿血怎么办 牙齿牙根长在神经里怎么办