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

求解代码

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

相关推荐
折翅鵬10 小时前
Android史诗级网络优化实践总结
android·网络
赏金术士12 小时前
Android 项目模块化与 Feature 组件实践
android·kotlin·模块化
summerkissyou198716 小时前
Android-UI-获取屏幕尺寸的方法
android·ui
用户860225046747216 小时前
Kotlin 函数式编程入门与实践指南
android
最爱睡觉睡觉睡觉18 小时前
CSS → Flutter 对照手册
android·前端
xingpanvip18 小时前
星盘接口开发文档:马盘次限盘接口指南
android·开发语言·python·php·lua
用户261904985615719 小时前
JUnit4 完整配置流程
android
用户261904985615719 小时前
JaCoCo 完整配置流程
android
QING61820 小时前
Android面试 —— 八股文之app启动流程
android·面试·app
海鸥-w20 小时前
python(fastapi) 实现更新,新增,删除接口
android·python·fastapi