博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在线求中位数
阅读量:6681 次
发布时间:2019-06-25

本文共 1578 字,大约阅读时间需要 5 分钟。

在线求第k个数做得多了,在线求中位数也是用堆,一个最大堆,一个最小堆。

思想大概是这样子的:

  1. 一个最大堆,一个最小堆,最大堆对应于前n/(n+1)个数,最小堆对应于后n/n+1个数;假设最大堆堆项元素为n1, 最小堆堆顶为n2, 则n1 <= n2;
  2. 确保两个堆的大小最多只差1. 设最大堆大小为s1, 最小堆大小为s2,则abs(s1-s2) <= 1;
  3. 对于新来的数m,分情况调整:
    1. 如果s1== s2, 那么:如果m<= n2, m插入到最大堆,s1= s1+1; 否则插入到最小堆,s2=s2+1;
    2. 如果s1 > s2, 那么:如果m >= n1, m插入到最小堆,s2=s2+1;否则,n1pop出最大堆,然后push进最小堆,然后m进最大堆,s2=s2+1;
    3. 如果s1 < s2, 那么:如果m <=n2, m插入到最大堆,s1=s1+1;否则,n2pop出最小堆,然后push进最大堆,然后m进最小堆,s1=s1+1;

代码如下:

 

1 int main(int argc, char** argv) { 2     priority_queue
, less
> maxHeap; 3 priority_queue
, greater
> minHeap; 4 5 vector
nums; 6 srand(time(NULL)); 7 for (int i = 0; i < 10000; ++i) { 8 nums.push_back(rand() % 1000); 9 cout << nums[i] << " ";10 }11 cout << endl;12 13 double median; 14 for (int i = 0; i < nums.size(); ++i) {15 if (maxHeap.size() == minHeap.size()) {16 if (minHeap.empty() || nums[i] <= minHeap.top()) {17 maxHeap.push(nums[i]);18 median = maxHeap.top();19 } else {20 minHeap.push(nums[i]);21 median = minHeap.top();22 }23 } else if (maxHeap.size() > minHeap.size()) {24 if (maxHeap.empty() || nums[i] >= maxHeap.top()) {25 minHeap.push(nums[i]);26 } else {27 minHeap.push(maxHeap.top()); 28 maxHeap.pop();29 maxHeap.push(nums[i]);30 }31 median = (maxHeap.top() + minHeap.top()) / 2.0;32 } else {33 if (minHeap.empty() || nums[i] <= minHeap.top()) {34 maxHeap.push(nums[i]);35 } else {36 maxHeap.push(minHeap.top());37 minHeap.pop();38 minHeap.push(nums[i]);39 }40 median = (maxHeap.top() + minHeap.top()) / 2.0;41 }42 cout << i << "-th: " << median << endl;43 }44 45 return 0;46 }

 

转载于:https://www.cnblogs.com/linyx/p/4062914.html

你可能感兴趣的文章
Hibernate之一级缓存
查看>>
Python基础之定义有默认参数的函数
查看>>
iOS5中的UUID
查看>>
(转载)XML Tutorial for iOS: How To Read and Write XML Documents with GDataXML
查看>>
poj 3259 Wormholes
查看>>
py学习之道
查看>>
o(1)复杂度之双边滤波算法的原理、流程、实现及效果。
查看>>
python中requests模块使用
查看>>
git bash 常用命令 新手学习
查看>>
最短路径
查看>>
POJ题目(转)
查看>>
day28 classmethod 装饰器
查看>>
QName
查看>>
Java使用线程并发库模拟弹夹装弹以及发射子弹的过程
查看>>
程序员找不女朋友的原因
查看>>
C#编程之“串口通讯多次接收”
查看>>
【python 文件操作】python 文件操作
查看>>
线程相关
查看>>
第十一次作业
查看>>
ubuntu 为rabbitmq安装web插件管理界面(为了远程查看rabbitmq) 分类...
查看>>