数据流中的中位数
2016-08-15 16:18
375 查看
题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。class Solution {
public:
void Insert(int num) {
data.push_back(num);
std::sort(data.begin(), data.end());
}
double GetMedian() {
unsigned int size = data.size();
if (size & 1) {
return data[size >> 1];
} else {
int left = data[(size >> 1) - 1];
int right = data[size >> 1];
return (static_cast<double>(left) + right) / 2;
}
}
private:
vector<int> data;
};
class Solution {
private:
vector<int> min;
vector<int> max;
public:
void Insert(int num)
{
if(((min.size()+max.size())&1)==0)//偶数时 ,放入最小堆
{
if(max.size()>0 && num<max[0])
{
// push_heap (_First, _Last),要先在容器中加入数据,再调用push_heap ()
max.push_back(num);//先将元素压入容器
push_heap(max.begin(),max.end(),less<int>());//调整最大堆
num=max[0];//取出最大堆的最大值
//pop_heap(_First, _Last),要先调用pop_heap()再在容器中删除数据
pop_heap(max.begin(),max.end(),less<int>());//删除最大堆的最大值
max.pop_back(); //在容器中删除
}
min.push_back(num);//压入最小堆
push_heap(min.begin(),min.end(),greater<int>());//调整最小堆
}
else//奇数时候,放入最大堆
{
if(min.size()>0 && num>min[0])
{
// push_heap (_First, _Last),要先在容器中加入数据,再调用push_heap ()
min.push_back(num);//先压入最小堆
push_heap(min.begin(),min.end(),greater<int>());//调整最小堆
num=min[0];//得到最小堆的最小值(堆顶)
//pop_heap(_First, _Last),要先调用pop_heap()再在容器中删除数据
pop_heap(min.begin(),min.end(),greater<int>());//删除最小堆的最大值
min.pop_back(); //在容器中删除
}
max.push_back(num);//压入数字
push_heap(max.begin(),max.end(),less<int>());//调整最大堆
}
}
/*获取中位数*/
double GetMedian()
{
int size=min.size()+max.size();
if(size<=0) //没有元素,抛出异常
return 0;//throw exception("No numbers are available");
if((size&1)==0)//偶数时,去平均
return ((double)(max[0]+min[0])/2);
else//奇数,去最小堆,因为最小堆数据保持和最大堆一样多,或者比最大堆多1个
return min[0];
}
};
相关文章推荐
- Android Activity 四种启动模式
- MongoDB学习笔记(5)分片技术
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- eclipse启动项目非常慢
- poj 2455 Secret Milking Machine (网络流)
- redis基本命令
- druid配置数据库连接使用密文密码
- 01背包
- list,set练习和Map简述
- tcp服务器与客户端
- 归并排序
- 找连续数 HDU5247
- HDU 1561(树形dp)
- 【背包/母函数】HDU2069-Coin Change
- js 窗口操作
- discuz 微社区 您请求的XXXX无法访问 接口错误(ERR02)
- jstl标签的用法(一)
- POJ 1149-PIGS(Ford-Fulkerson 标号法求网络最大流)
- 如何解读Caffe源码
- Asp.net 解决下载乱码问题,支持火狐、IE、谷歌等主流浏览器