前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据流中的中位数

数据流中的中位数

作者头像
名字是乱打的
发布2022-05-13 09:23:15
4280
发布2022-05-13 09:23:15
举报
文章被收录于专栏:软件工程
题目描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

两个堆实现思路

为了保证插入新数据和取中位数的时间效率都高效,这里使用大顶堆+小顶堆的容器,并且满足: 1、两个堆中的数据数目差不能超过1,这样可以使中位数只会出现在两个堆的交接处; 2、大顶堆的所有数据都小于小顶堆,这样就满足了排序要求。 数据排列为: ~~~~~~~~Maxheap minheap~~~~~

为了实现此方法,我们需要平分两个堆,奇数放一个堆,偶数放一个堆里,并且每次存数据时候把堆顶弹到另外一个堆里

方法一:代码

代码语言:javascript
复制
 public class myComperator implements Comparator<Integer>{
        @Override //从大到小排序
        public int compare(Integer o1, Integer o2) {
            return o2-o1;
        }
    }
   //          ~~~~~~~~Maxheap   minheap~~~~~
    PriorityQueue<Integer> minHeap=new PriorityQueue<>();//根最小
    PriorityQueue<Integer> MaxHeap=new PriorityQueue<>(new myComperator());//根最大
    int count=0;
    public void Insert(Integer num) {
        if ((count&1)==0){//偶数,放小根堆
            minHeap.offer(num);
            MaxHeap.offer(minHeap.poll());
        }else {
            MaxHeap.offer(num);
            minHeap.offer(MaxHeap.poll());
        }
        count++;
    }

    public Double GetMedian() {
        return (count&1)==0?new Double((minHeap.peek() + MaxHeap.peek())+"")/2:new Double(MaxHeap.peek()+"");
    }

方法二:普通排序,找中位数时候如果奇数直接返回,偶数返回平均数

代码语言:javascript
复制
import java.util.*;
public class Solution {
 
     ArrayList<Integer> al = new ArrayList<Integer>();
    public void Insert(Integer num) {
        al.add(num);
        Collections.sort(al);
    }
 
   public Double GetMedian() {
        int mid = al.size()/2;
        if((al.size()&1) == 0){
            Integer n1 = al.get(mid);
            Integer n2 = al.get(mid - 1);
            double s = (Double.valueOf(n1 + "") + Double.valueOf(n2 + ""))/2;
            return s;
        }else{
            double s = Double.valueOf(al.get(mid) + "");
            return s;
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 两个堆实现思路
  • 方法一:代码
  • 方法二:普通排序,找中位数时候如果奇数直接返回,偶数返回平均数
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档