【大顶堆+小顶堆】数据流中的中位数

求解代码

java 复制代码
private PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a,
            b)->(b - a)); //大顶堆存较小的一半
    private PriorityQueue<Integer> minHeap = new PriorityQueue<>((a, b)->(a - b));

    public void Insert(Integer num) {
        if (maxHeap.isEmpty() || num <= maxHeap.peek()) {
            maxHeap.add(num);
        } else {
            minHeap.add(num);
        }
        balance();
    }

    public Double GetMedian() {
        if (maxHeap.size() == minHeap.size()) {
            return (double)((maxHeap.peek() + minHeap.peek()) / 2.0);
        } else {
            return (double)(maxHeap.size() > minHeap.size() ? maxHeap.peek() :
                            minHeap.peek());
        }
    }

    private void balance() {
        if (Math.abs(maxHeap.size() - minHeap.size()) == 2) {
            if (maxHeap.size() > minHeap.size()) {
                minHeap.add(maxHeap.poll());
            } else {
                maxHeap.add(minHeap.poll());
            }
        }
    }

小贴士

1.Java的PriorityQueue默认是小顶堆,这里采用大顶堆maxHeap存储较小的一半,用小顶堆存储较大的一半。

2.(maxHeap.peek() + minHeap.peek()) / 2.0,除以2.0 触发浮点运算,不会丢失小数位

相关推荐
得一录2 小时前
Android AIDL 在智能体和IOT设备中的使用
android·人工智能·物联网·aigc
独行soc3 小时前
2026年渗透测试面试题总结-1(题目+回答)
android·开发语言·网络·安全·web安全·渗透测试·php
IT瑞先生3 小时前
php unicode与中文互转
android·开发语言·php
aqi003 小时前
FFmpeg开发笔记(九十九)基于Kotlin的国产开源播放器DKVideoPlayer
android·ffmpeg·kotlin·音视频·直播·流媒体
Heynchy4 小时前
Android 注解的重要元素【Retention】【三】
android·java·开发语言
故事不长丨4 小时前
《Android EventBus详解与实战:从入门到精通,组件通信不再难》
android·事件·eventbus·广播·组件通信
橙子199110164 小时前
Kotlin 中的继承与实现
android
Luuuuu~5 小时前
下载Android SDK报错:Not in GZIP format.
android
虫小宝5 小时前
基于责任链模式构建可扩展的微信群发消息风控过滤器(Java实现)
android·java·责任链模式