76、堆-数据流的中位数

思路:

        这个问题是动态数据流中位数查找问题。在数据流中,数据是逐个到来的,而我们需要在任何时候快速返回已有数据的中位数。中位数是将数据集分成两个等长的子集,一个包含所有较小的元素而另一个包含所有较大的元素。

为了高效解决这个问题,我们可以使用两个优先队列(堆):

  • 一个最大堆(maxQueue),用来存储当前所有元素中较小的一半,它能够保证在堆顶的是这个子集中最大的元素。
  • 一个最小堆(minQueue),用来存储较大的一半,它能够保证在堆顶的是这个子集中最小的元素。

这样设计的原因是:

最大堆和最小堆的堆顶元素可以视为中位数或中位数的候选值,因为这两个元素正好将整个数据集分为两个等长的部分,或者其中一个部分多一个元素(当数据总数是奇数时)。
插入操作(addNum)可以保持两个堆的大小平衡(即数量相等或仅差一个元素),这样可以确保中位数总是处于堆顶,可以在常数时间内被检索到。
当数据总数为偶数时,中位数是两个堆顶元素的平均值;当数据总数为奇数时,中位数是元素多的那个堆的堆顶元素。
在addNum方法中,每次添加一个新元素时,我们首先判断它应该属于哪一个子集:

如果新元素小于等于最大堆的堆顶元素,或者最大堆为空,这意味着这个新元素属于较小的一半,因此应该加入最大堆。
否则,它属于较大的一半,应该加入最小堆。
加入元素后,我们可能需要重新平衡两个堆以确保它们的大小满足要求。如果任一堆的大小超过另一堆的大小超过1,我们将堆顶元素移动到另一堆以恢复平衡。

在findMedian方法中,我们根据两个堆的大小关系来确定中位数:

如果两个堆的大小相等,这意味着元素总数是偶数,我们返回两个堆顶元素的平均值作为中位数。
如果两个堆的大小不等,这意味着元素总数是奇数,我们返回元素较多的那个堆的堆顶元素作为中位数。
整体上,这个设计利用了最大堆和最小堆各自的性质,以及它们在维护中位数方面的互补性,从而提供了一个既高效又简洁的解决方案。

class MedianFinder {
    // 用于存储较大一半元素的小顶堆。
    PriorityQueue<Integer> minQueue;
    // 用于存储较小一半元素的大顶堆。
    PriorityQueue<Integer> maxQueue;

    // MedianFinder 类的构造函数。
    public MedianFinder() {
        // 初始化 minQueue 为小顶堆。
        minQueue = new PriorityQueue<>();
        // 初始化 maxQueue 为大顶堆,使用自定义比较器来逆序元素。
        maxQueue = new PriorityQueue<>((a, b) -> b - a);
    }

    // 将数字添加到数据结构中的方法。
    public void addNum(int num) {
        // 如果 maxQueue 是空的,直接将数字添加到 maxQueue。
        if (maxQueue.isEmpty()) {
            maxQueue.add(num);
        } else {
            // 根据 maxQueue 的顶部元素决定将数字添加到 minQueue 或 maxQueue。
            if (maxQueue.peek() >= num) {
                maxQueue.add(num);
            } else {
                minQueue.add(num);
            }
        }

        // 如果必要的话,调整堆的大小,确保两个堆的大小差不多于1。
        if (maxQueue.size() == minQueue.size() + 2) {
            minQueue.add(maxQueue.poll());
        }
        if (minQueue.size() == maxQueue.size() + 2) {
            maxQueue.add(minQueue.poll());
        }
    }

    // 查找当前添加的数字的中位数的方法。
    public double findMedian() {
        // 如果两个堆的大小相同,中位数是它们顶部元素的平均值。
        if (maxQueue.size() == minQueue.size()) {
            return (maxQueue.peek() + minQueue.peek()) / 2.0;
        } else if (maxQueue.size() > minQueue.size()) {
            // 如果 maxQueue 的元素更多,中位数是 maxQueue 的顶部元素。
            return maxQueue.peek() * 1.0;
        } else {
            // 如果 minQueue 的元素更多,中位数是 minQueue 的顶部元素。
            return minQueue.peek() * 1.0;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/586578.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用word2vec包将中文转变为词向量

代码展示&#xff1a; import jieba import re import json import logging import sys import gensim.models as word2vec from gensim.models.word2vec import LineSentence, loggerpattern u[\\s\\d,.<>/?:;\\"[\\]{}()\\|~!\t"#$%^&*\\-_a-zA-Z&…

【算法刷题 | 贪心算法05】4.27(K次取反后最大化的数组和、加油站)

文章目录 8.K次取反后最大化的数组和8.1题目8.2解法&#xff1a;贪心8.2.1贪心思路8.2.2代码实现 9.加油站9.1题目9.2解法&#xff1a;贪心9.2.1贪心思路9.2.2代码实现 8.K次取反后最大化的数组和 8.1题目 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数…

【基础算法总结】滑动窗口一

滑动窗口 1.长度最小的字数组2.无重复字符的最长子串3.最大连续1的个数 III4.将 x 减到 0 的最小操作数 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&…

利用大型语言模型提升个性化推荐的异构知识融合方法

在推荐系统中&#xff0c;分析和挖掘用户行为是至关重要的&#xff0c;尤其是在美团外卖这样的平台上&#xff0c;用户行为表现出多样性&#xff0c;包括不同的行为主体&#xff08;如商家和产品&#xff09;、内容&#xff08;如曝光、点击和订单&#xff09;和场景&#xff0…

《QT实用小工具·四十九》QT开发的轮播图

1、概述 源码放在文章末尾 该项目实现了界面轮播图的效果&#xff0c;包含如下特点&#xff1a; 左右轮播 鼠标悬浮切换&#xff0c;无需点击 自动定时轮播 自动裁剪和缩放不同尺寸图片 任意添加、插入、删除 单击事件&#xff0c;支持索引和自定义文本 界面美观&#xff0c;圆…

服务器部署开源大模型完整教程 Ollama+Llama3+open-webui

前言 最近大语言模型大火&#xff0c;正好最近打比赛可能会用得上LLMs&#xff0c;今天就在学校的服务器上面进行一次部署。这样之后就可以直接在内网里面使用学校的LLMs了。 介绍 Ollama&#xff1a;一款可以让你在本地快速搭建大模型的工具 官网&#xff1a;https://olla…

基于uniapp vue3.0 uView 做一个点单页面(包括加入购物车动画和左右联动)

1、实现效果&#xff1a; 下拉有自定义组件&#xff08;商品卡片、进步器、侧边栏等&#xff09;源码 2、左右联动功能 使用scroll-view来做右边的菜单页&#xff0c;title的id动态绑定充当锚点 <scroll-view :scroll-into-view"toView" scroll-with-animation…

【C++】封装哈希表 unordered_map和unordered_set容器

目录​​​​​​​ 一、unordered系列关联式容器 1、unordered_map 2、unordered_map的接口 3、unordered_set 二、哈希表的改造 三、哈希表的迭代器 1、const 迭代器 2、 operator 3、begin()/end() ​ 4、实现map[]运算符重载 四、封装 unordered_map 和 unordered_se…

基于t972 Android9 AP6256,如何在设置中添加5G热点选项,并使其正常打开

通过设置的的WiFi热点选项可以知道关键词“2.4GHz”&#xff0c;因此可以其全局搜索&#xff0c;在packages\apps\Settings\res\values\strings.xml文件下找到如下图所示&#xff0c; 从上面注释可以知道&#xff0c;选项按键选择2.4GHz触发的按键关键词是“wifi_ap_choose_2G…

JAVA读取从WPS在Excel中嵌入的图片资源

读取从WPS在Excel中嵌入的图片资源 引言 许多数据文件中可能包含嵌入式图片&#xff0c;这些图片对于数据分析和可视化非常重要。然而&#xff0c;从 WPS 在 Excel 中读取这些图片可能会有一些技术挑战。在本文中&#xff0c;我将展示如何从 WPS Excel 文件中读取嵌入的图片&am…

安居水站:心理咨询的一般伦理原则

正文字数&#xff1a; 1157 图片数&#xff1a; 24 阅读时间&#xff1a;大约4分钟 摘要&#xff1a;心理咨询是帮助个体解决心理问题的重要手段。为确保咨询的有效性和咨询对象的权益&#xff0c;心理咨询必须遵循一定的伦理原则。本文详细探讨了心理咨询…

PDF高效编辑器,支持修改PDF文档并转换格式从PDF文件转换成图片文件,轻松管理你的文档世界!

PDF文件已成为我们工作、学习和生活中不可或缺的一部分。然而&#xff0c;传统的PDF阅读器往往只能满足简单的查看需求&#xff0c;对于需要频繁编辑、修改或转换格式的用户来说&#xff0c;就显得力不从心。现在&#xff0c;我们为您带来一款全新的PDF高效编辑器&#xff0c;让…

对话访谈——五问RAG与搜索引擎:探索知识检索的未来

记一次关于RAG和搜索引擎在知识检索方面的对话访谈&#xff0c;针对 RAG 与传统搜索引擎的异同,以及它们在知识检索领域的优劣势进行了深入的探讨。 Q&#xff1a;传统搜索引擎吗&#xff0c;通过召回-排序的两阶段模式&#xff0c;实现搜索逻辑的实现&#xff0c;当前RAG技术也…

Spark Structured Streaming 分流或双写多表 / 多数据源(Multi Sinks / Writes)

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

使用 scikit-learn 进行机器学习的基本原理-2

介绍 scikit-learn 估计器对象 每个算法都通过“Estimator”对象在 scikit-learn 中公开。 例如&#xff0c;线性回归是&#xff1a;sklearn.linear_model.LinearRegression 估计器参数&#xff1a;估计器的所有参数都可以在实例化时设置&#xff1a; 拟合数据 让我们用 nump…

第7篇:创建Nios II工程之控制LED<二>

Q&#xff1a;上一期我们完成了Quartus硬件工程部分&#xff0c;本期我们创建Nios II软件工程这部分。 A&#xff1a;创建完BSP和Nios II Application之后&#xff0c;在source文件main.c中添加LED控制代码&#xff1a;system.h头文件包含了Platform Designer系统中IP的硬件信…

VUE3----Tabs swiper 滑动切换

Tabs swiper 滑动切换 <template><view class"cc-tab-container"><scroll-view class"tab-head" :class"tabClassName" scroll-x"true" scroll-with-animation :scroll-left"state.scrollLeft"><view…

变电站综合自动化系统:Modbus-PLC-645转IEC104网关方案

前言 电力行业作为关系国计民生的重要基础产业&#xff0c;是关系千家万户的公用事业。但是要做好电力行业安全保障工作的前提&#xff0c;是需要对应的技术人员详细了解电力工业使用的系统、设备以及各类协议的安全特性&#xff0c;本文将主要介绍IEC 104协议的定义和钡铼技术…

STL——stackqueue

stack stack即为栈&#xff0c;先进后出是其特点 栈只有栈顶元素能被外界使用&#xff0c;故不存在遍历行为 栈中常用接口 构造函数 stack<T> stk; //默认构造方式 stack(const stack &stk); //拷贝构造 赋值操作 stack& operator(const stack &stk); …

对汉诺塔递归算法的简单理解

一.历史背景:汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始…