package com.niuke;
import java.util.Comparator;
import java.util.PriorityQueue;
/**
* Created by admin on 2018/3/13.
* 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,
* 那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,
* 那么中位数就是所有数值排序之后中间两个数的平均值。
*/
public class GetMedianInStream {
//1 经典巧解 好方法
int count=0;//用于计数
PriorityQueue<Integer> minHeap=new PriorityQueue<>();//小顶堆 里面存大数
PriorityQueue<Integer> maxHeap=new PriorityQueue<>(13, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});//大顶堆 里面存小数
public void Insert(Integer num) {
if(count%2==0) {//如果为偶数 将数放入小顶堆 不是直接放,
// 而是经过大顶堆处理后将大顶堆中最大的数放入小顶堆
maxHeap.offer(num);
int resNum=maxHeap.poll();
minHeap.offer(resNum);
} else {//如果为奇数 将数放入大顶堆 不是直接放,
// 而是经过小顶堆处理后将小顶堆中最小的数放入大顶堆
minHeap.offer(num);
int resNum=minHeap.poll();
maxHeap.offer(resNum);
}
count++;
}
public Double GetMedian() {
if(count%2==0) {//偶数 中位数为中间两个数之和
return new Double(minHeap.peek()+maxHeap.peek())/2;
} else {//奇数 中位数为中间两那个数
return new Double(minHeap.peek());
}
}
}
数据流中的中位数
最新推荐文章于 2024-02-18 20:10:46 发布