前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >数据流中的中位数

数据流中的中位数

作者头像
MickyInvQ
发布2021-12-07 13:31:19
发布2021-12-07 13:31:19
37300
代码可运行
举报
文章被收录于专栏:InvQ的专栏InvQ的专栏
运行总次数:0
代码可运行

题目描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

解题思路

代码语言:javascript
代码运行次数:0
复制
public class FindMedianByHeap {
    public PriorityQueue<Integer> getLeft() {
        return left;
    }

    public PriorityQueue<Integer> getRight() {
        return right;
    }

    /* 大顶堆,存储左半边元素 */
    private PriorityQueue<Integer> left = new PriorityQueue<>((o1, o2) -> o2 - o1);
    /* 小顶堆,存储右半边元素,并且右半边元素都大于左半边 */
    private PriorityQueue<Integer> right = new PriorityQueue<>();

    public void setN(int n) {
        N = n;
    }

    /* 当前数据流读入的元素个数 */
    private int N = 0;

    public void insert(Integer val) {
        /* 插入要保证两个堆存于平衡状态 */
        if (N % 2 == 0) {
            /* N 为偶数的情况下插入到右半边。
             * 因为右半边元素都要大于左半边,但是新插入的元素不一定比左半边元素来的大,
             * 因此需要先将元素插入左半边,然后利用左半边为大顶堆的特点,取出堆顶元素即为最大元素,此时插入右半边 */
            left.add(val);
            right.add(left.poll());
        } else {
            right.add(val);
            left.add(right.poll());
        }
        N++;
    }

    public Double getMedian() {
        if (N % 2 == 0)
            return (left.peek() + right.peek()) / 2.0;
        else
            return (double) right.peek();
    }

    public static void main(String[] args) {
        FindMedianByHeap findMedianByHeap = new FindMedianByHeap();
        int[] array = {6,3,2,5,4,1};
        for (int i : array) {
            findMedianByHeap.insert(i);
        }
        System.out.println("left = "+findMedianByHeap.getLeft());
        System.out.println("right = "+findMedianByHeap.getRight());
        System.out.println("median is "+findMedianByHeap.getMedian());
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 解题思路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档