您的位置:首页 > 其它

数据流中的中位数

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());
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  堆-数据流