堆的应用— 流的中位数

该博客介绍了一种使用Java实现流中中位数计算的方法,通过维护两个优先队列(一个小根堆和一个大根堆)来保持数据平衡。当新数据加入时,根据数据大小决定将其放入小根堆或大根堆。当堆不平衡时,会调整元素以保持堆的性质。博客还提供了一个完整的示例代码,展示了如何添加数据并获取中位数。
摘要由CSDN通过智能技术生成

import java.util.Comparator;
import java.util.PriorityQueue;

//生成小根堆的比较器
class MinHeapComparator1 implements Comparator<Integer> {
    @Override
    public int compare(Integer o1,Integer o2){
        return  o1-o2;
    }
}
//生成大根堆的比较器
class MaxHeapComparator1 implements Comparator<Integer>{
    @Override
    public int compare(Integer o1,Integer o2){
        return o2-o1;
    }
}
//
class MedianHolder1{
    //成员变量     attribute(属性)
    private PriorityQueue<Integer> minHeap;
    private PriorityQueue<Integer> maxHeap;

    //构造器      Holder(持有者)
    public MedianHolder1(){
        this.minHeap=new PriorityQueue<Integer>(new MinHeapComparator1());
        this.maxHeap=new PriorityQueue<Integer>(new MaxHeapComparator1());
    }
    //数据进流
    public void addNum(int num){
        if(maxHeap.isEmpty()||num<=maxHeap.peek()){
            maxHeap.add(num);
        } else{
            minHeap.add(num);
        }
        modifyTowHeap1();
    }
    //求中位数
    public int getMedian(){
        if(maxHeap.isEmpty()){
            return -1;
        }
        if(this.minHeap.size()==this.maxHeap.size()){
            return (this.maxHeap.peek()+this.minHeap.peek())/2;
        }else{
            return this.maxHeap.size()>this.minHeap.size()?this.maxHeap.peek():this.minHeap.peek();
        }
    }
    public void print(){
      while(!this.maxHeap.isEmpty()){
          System.out.print(this.maxHeap.poll()+" ");
      }
      while(!this.minHeap.isEmpty()){
          System.out.println(this.minHeap.poll()+" ");
      }
    }

    //调整两个堆
    //策略:两个之间的数量不能超过2个元素
    private void modifyTowHeap1(){
        if(this.maxHeap.size()==this.minHeap.size()+2){
            //如果小根堆的数量比大根堆的数量超过2,就把小根堆的堆顶元素放到大根堆中
            this.maxHeap.add(this.minHeap.poll());
        }
        if(this.minHeap.size()==this.maxHeap.size()+2){
            this.minHeap.add(this.maxHeap.poll());
        }
    }
}

//求流中的中位数
public class Test14 {
    public static void main(String[] args) {
        MedianHolder1 medianHolder1=new MedianHolder1();
        medianHolder1.addNum(1);
        medianHolder1.addNum(2);
        medianHolder1.addNum(3);
        medianHolder1.addNum(4);
        int median=medianHolder1.getMedian();
        System.out.println(median);

    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值