数据流中的中位数
2016-05-06 15:03
447 查看
题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
思路:借助于大顶堆和小顶堆来模拟数据流的动态过程。
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。
思路:借助于大顶堆和小顶堆来模拟数据流的动态过程。
package alex.jzoffer; import java.util.Comparator; import java.util.PriorityQueue; public class GetMedian { PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(); //小顶堆 //大顶堆 PriorityQueue<Integer> maxHeap = new PriorityQueue<>(30, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }); int count = 0; public void Insert(Integer num) { //当数据总数为偶数时,新加入的元素,应当进入小根堆(注意不是直接进入小根堆,而是经大根堆筛选后取大根堆中最大元素进入小根堆) if(count % 2 ==0){ maxHeap.offer(num); int maxNumOfMaxH = maxHeap.poll(); minHeap.offer(maxNumOfMaxH); } //当数据总数为奇数时,新加入的元素,应当进入大根堆(注意不是直接进入大根堆,而是经小根堆筛选后取小根堆中最小元素进入大根堆) else{ minHeap.offer(num); int minNumOfMinH = minHeap.poll(); maxHeap.offer(minNumOfMinH); } count++; } public Double GetMedian() { if(count % 2 ==0){ return new Double((maxHeap.peek() + minHeap.peek())) /2; } else{ return new Double(minHeap.peek()); } } }
相关文章推荐
- 线性表的顺序存储结构
- 用户自定义化你的广告
- MVP的详解
- initWithCoder、awakeFromNib、initWithFrame
- Adapter中函数的调用顺序
- hust——1010F - The Minimum Length(kmp专练)
- Activity 的启动流程分析
- Ubuntu下mysql的安装以及简单的命令操作
- 【转】测试思考之——思想有多远,你就能走多远
- 关于Java和.NET之间的通信问题(JSON)
- 笔记-集合
- crontab 定时任务
- Android LayoutInflater深度解析 给你带来全新的认识
- handleCmd_SETUP 函数
- Android Parcelable
- TextView 单行显示长文本
- indexOf() lastIndexOf() 与 jQuery.inArray()
- 提取视频文件首帧为jpeg 图片
- androidstudio连接夜神模拟器
- 苹果多线程网络编程之-GCD队列与任务的理解