数据流中的中位数

该博客介绍了如何在数据流中实时计算中位数,利用最大堆和最小堆来管理数据。当数据总数为偶数时,新数据先经过最大堆筛选后进入最小堆;奇数时则相反。最终,中位数可以通过最大堆和最小堆的根节点确定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于海量数据以及流的数据,要考虑到使用最大堆与最小堆来管理。

 

[最大堆 |   左边最大 leftMax 右边最小rightMin 最小堆]

      (最大堆中的数据始终要保持小于最小堆中的数据)

当数据总数为偶数时,新加入的数据要加入最小堆。但在加入最小堆之前先进入最大堆进行筛选,把最大堆中的最大数据替换出来加入最小堆。奇数时反之。

数据流处理完毕后,最大堆中的所有数据都小于最小堆中的数据,这时中位数就是最大堆根节点与最小堆根节点相加 / 2,或者是最小堆的根节点(数据总数是奇数时,最后一个数据落入小堆,所以奇数就是返回minHeap)。

import java.util.*;

public class Solution {
    private int count = 0;
    //构建小根堆
    PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
    //构建大根堆
    PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(11, new Comparator<Integer>(){
    @Override
    public int compare(Integer o1, Integer o2){
        return 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值