首页 > 其他分享 >数据流的中位数(优先队列)

数据流的中位数(优先队列)

时间:2025-01-04 15:44:31浏览次数:5  
标签:队列 中位数 num queMax 数据流 MedianFinder queMin size

中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。

  • 例如 arr = [2,3,4] 的中位数是 3 。
  • 例如 arr = [2,3] 的中位数是 (2 + 3) / 2 = 2.5 。

实现 MedianFinder 类:

  • MedianFinder() 初始化 MedianFinder 对象。

  • void addNum(int num) 将数据流中的整数 num 添加到数据结构中。

  • double findMedian() 返回到目前为止所有元素的中位数。与实际答案相差 10-5 以内的答案将被接受。

 

思路:使用两个优先队列,分别存放中位数左边的数和中位数右边的数,故需要他们分别按降序和升序排序,并且在添加元素时要注意两个队列的大小之差最多为1,这样就能直接从队头得到中位数。

class MedianFinder {
public:
/**queMin、queMax存储 int 类型的数据,并使用 vector<int> 作为内部容器。
 *less<int> 与greater<int>是一个比较函数对象,分别实现了降序和升序排序逻辑
 */
    priority_queue<int, vector<int>, less<int>> queMin;//降序
    priority_queue<int, vector<int>, greater<int>> queMax;//升序
    MedianFinder() {
        
    }
    
    void addNum(int num) {
        if(queMin.empty()||num<=queMin.top()){
            queMin.push(num);
            //规定queMin最多只能存放比queMax的大小多1,这样当数组元素个数为奇数时,中位数就在queMin中
            if(queMin.size()>queMax.size()+1){
                queMax.push(queMin.top());
                queMin.pop();
            }
        }else{
            queMax.push(num);
            //根据规定,queMax的大小不能超过queMin的大小
            if(queMax.size()>queMin.size()){
                queMin.push(queMax.top());
                queMax.pop();
            }
        }
    }
    
    double findMedian() {
        if((queMax.size()+queMin.size())%2!=0){//根据规定,当数组元素个数为奇数时,中位数就在queMin中
            return queMin.top();
        }else{
            return (queMin.top()+queMax.top())/2.0;
        }
    }
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */

 

标签:队列,中位数,num,queMax,数据流,MedianFinder,queMin,size
From: https://www.cnblogs.com/yueshengd/p/18651971

相关文章

  • 前k个高频元素(优先队列)
    给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例1:输入:nums=[1,1,1,2,2,3],k=2输出:[1,2]示例2:输入:nums=[1],k=1输出:[1]classSolution{public:vector<int>topKFreque......
  • LeetCode232.用栈实现队列
    题目:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()从队列的开头移除并返回元素intpeek()返回队列开头的元素booleanempty()如果队......
  • 力扣刷题:栈和队列OJ篇(下)
    大家好,这里是小编的博客频道小编的博客:就爱学编程很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!目录1.括号匹配问题(1)题目描述(2)解题思路2.循环队列(1)题目描述(2)解题思路快乐的时光总是短暂,咱们下篇博文再见啦!!!如果小编的文章会对......
  • python中的优先队列
    在Python中,优先队列(PriorityQueue)是一个可以随时获取队列中最大(或最小)元素的数据结构。Python的标准库heapq提供了一个实现最小堆的优先队列,默认情况下是最小堆,但可以通过一些技巧来实现最大堆。优先队列在算法中常用于求解最短路径、合并有序链表、求解k个最小/最大的元......
  • Coravel:一个可轻松实现任务调度、队列、邮件发送的开源项目
    推荐一个轻量级的任务调度开源项目。01项目简介Coravel是一个.NET开源任务调度库,只需简单代码、几乎零配置就可以实现多种功能柜,如任务调度、队列、缓存、事件广播和邮件发送等。该项目特点就是让这些通常复杂的功能变得易于访问和使用,同时提供简洁、直观的语法。02核心功能......
  • 在Lazarus下的Free Pascal编程教程——按数据流程规划程序结构
    0.前言我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”和“2.已经......
  • 寻找两个正序数组的中位数(二分查找)
    给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log(m+n)) 。 示例1:输入:nums1=[1,3],nums2=[2]输出:2.00000解释:合并数组=[1,2,3],中位数2示例2:输入:nums1=[1......
  • celery+flask+数据库一个队列执行多个任务出现死锁
    celery创建一个共享队列rpa,该队列下有一个轮循任务和执行任务轮循任务会读取redis队列,循环队列并根据任务情况执行任务轮循间隔为1s,每次轮循都会循环队列的所有任务启动命令为celery-Aapp.celeryworker-Pgevent-c1--loglevelINFO-Qrpa此时设置并发数为1时,用......
  • Java面试要点112 - Java延迟队列DelayQueue技术解析
    文章目录引言一、DelayQueue工作原理二、延迟队列的内部实现三、高级特性与优化3.1优先级控制3.2性能优化四、消息延迟投递系统五、定时任务调度实现六、异常处理与资源管理总结引言DelayQueue是Java并发包中一个专门用于延迟处理的阻塞队列实现,它根据延迟时间......
  • 力扣刷题:栈和队列OJ篇(上)
    大家好,这里是小编的博客频道小编的博客:就爱学编程很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!!目录1.用队列实现栈(1)题目描述(2)解题思路2.用两个栈实现队列(1)题目描述(2)解题思路快乐的时光总是短暂,咱们下篇博文再见啦!!!如果小编的......