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

求解代码

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 触发浮点运算,不会丢失小数位

相关推荐
xiangxiongfly91520 分钟前
Android GsonFactory总结
android·gson·gsonfactory
WythePlus2 小时前
Android 14 SELinux策略深度解析
android·安全策略·selinux策略
俩个逗号。。5 小时前
Kotlin flow 详解
android·开发语言·kotlin
橙光成长8 小时前
android-ad-cleaner:android免 Root 批量关闭系统开屏与营销推送
android·1024程序员节
深圳雨林凯AI8 小时前
图案裂变的底色衰减:alpha通道、亮度对比与白墨分色的量化拆解
android
mmsx8 小时前
Android 模块化收口:能力组合框架、手写 LifecycleOwner 与热修复共存
android
恋猫de小郭10 小时前
Flutter 可以更直接地调用原生 API 了,Dart Direct Native Interop
android·前端·flutter
2501_9160088910 小时前
iPhone 设备信息查看,用 KeyMob 看型号、序列号、电池健康和 UDID
android·ios·小程序·https·uni-app·iphone·webview
好的佩奇21 小时前
蓝牙之通信架构
android·flutter·蓝牙
FlightYe21 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频