数据流的中位数(Java)

数据流的中位数(Java)

题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数
代码:

import java.util.PriorityQueue;

/**
 * @desc 数据流中的中位数
 * @author zhaoliang
 * @date 20200412
 */
public class Main41 {
    //中位数的左区间,大顶堆
    private PriorityQueue<Integer> queue1 = new PriorityQueue<>(((o1,o2) -> (o2 - o1)));
    //中位数的右区间,小顶堆
    private PriorityQueue<Integer> queue2 = new PriorityQueue<>();
    //数据流中的个数
    private int sum = 0;

    public void Insert(Integer num) {
        if(sum % 2== 0){
            //当两个堆的元素个数一样的时候此时新增一个元素,我是放入大顶堆(左区间)
            queue1.add(num);
        }else {
            queue2.add(num);
        }
        if (!queue2.isEmpty() && queue1.peek() > queue2.peek()){

            int temp1 = queue1.poll();
            int temp2 = queue2.poll();

            queue1.add(temp2);
            queue2.add(temp1);
        }
        sum++;
    }

    public Double GetMedian() {
        if ( sum % 2 == 1){
            return  (double) queue1.peek();
        }else {
            return (queue1.peek() + queue2.peek())/2.0;
        }
    }
}
发布了71 篇原创文章 · 获赞 0 · 访问量 881

猜你喜欢

转载自blog.csdn.net/sinat_40968110/article/details/105464801