二叉堆,堆排序,STL优先队列的底层实现,剑指offer数据流中的中位数
2017-08-14 11:06
651 查看
一.
下图是从数组为0下标开始计算的。
下图是从数组为1下标开始计算的。引自《STL源码剖析》 p173
堆排序
64.数据流中的中位数。《剑指offer》 p286
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
下图是从数组为0下标开始计算的。
下图是从数组为1下标开始计算的。引自《STL源码剖析》 p173
堆排序
64.数据流中的中位数。《剑指offer》 p286
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
class Solution { public: void Insert(int num) { if((max.size()+min.size()) % 2 == 0) //数据总数目是偶数,将新的数据放入到最小堆中 { if(!max.empty() && num < max[0]) //如果新插入的数据比最大堆的最大值要小,那么就将新数据插入到最大堆中,并将最大堆的最大值弹出,放到最小堆中 { max.push_back(num); push_heap(max.begin(),max.end(),less<int>()); pop_heap(max.begin(),max.end(),less<int>()); //弹出最大堆的最大值 num = max.back(); max.pop_back(); } min.push_back(num); push_heap(min.begin(),min.end(),greater<int>()); //组建最小堆 } else //数据总数目是奇数,将新数据放入到最大堆中 { if(!min.empty()&&num > min[0]) //新插入的数据比最小堆的最小值还要大,那么就将新插入的数据放入最小堆中,并将最小堆的最小值弹出,放入最大堆中 { min.push_back(num); push_heap(min.begin(),min.end(),greater<int>()); pop_heap(min.begin(),min.end(),greater<int>()); //弹出最小堆最小值 num = min.back(); min.pop_back(); } max.push_back(num); push_heap(max.begin(),max.end(),less<int>()); } } double GetMedian() { int size = max.size()+min.size(); if(size == 0) return 0; double res = 0; if(size % 2 == 1) { /* if(min.empty()) res = max[0]; if(max.empty()) res = min[0];*/ res = min[0]; //当只有一个元素,不需要判断是最大堆还是最小堆,因为一个数是奇数,一定是放到最小堆中。 } else res = (max[0]+min[0])/2; return res; } vector<double> max; //最大堆 //***涉及到浮点运算,原始数据存储用double vector<double> min; //最小堆 };
相关文章推荐
- 基于二叉堆实现的优先队列和堆排序
- 优先队列(二叉堆实现) + 堆排序
- 算法基础:排序(四)——二叉堆、优先队列、堆排序——Python实现
- 算法基础:排序(四)——二叉堆、优先队列、堆排序——Python实现
- 用java实现一个基于堆排序的优先队列
- 优先队列的STL运用与哈夫曼树的实现
- 算法学习 - 优先队列的二叉堆实现
- 排序算法(四):优先队列、二叉堆以及堆排序
- (数据结构与算法分析 七)------优先队列中的二叉堆的实现( Java语言描述)
- 优先队列之二叉堆(JAVA实现)
- 数据结构之优先队列--二叉堆(Java实现)
- 优先队列的简单实现-二叉堆实现
- 二叉堆实现优先队列中的上滤和下滤
- 自己写GoBinaryHead 二叉堆binaryheap实现优先队列(堆)
- 最小堆得实现;优先队列的堆实现;堆排序的时间复杂度nlgn;
- 数据结构之优先队列--二叉堆(Java实现)
- 优先队列的实现--二叉堆
- 利用优先队列实现堆排序(自顶向下自底向上堆化完全二叉树的运用)
- java编程实现优先队列的二叉堆代码分享
- 学习记录2:优先队列 (二叉堆实现)