算法通关村-----数据流的中位数

数据流的中位数

问题描述

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

例如 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 以内的答案将被接受。

详见leetcode295

问题分析

查大用小,查小用大,查中间则需要两个堆,一个最大堆,一个最小堆,遍历元素,当最小堆为空或者当前元素大于最小堆堆顶元素时,放入最小堆,否则放入最大堆,当两个堆的元素数量相差大于1时,数量多的堆移除堆顶元素,放入另一个堆。如此,遍历结束后,小顶堆中存放着全部元素中较大的一半,大顶堆中存储着全部元素中较小的一半。中位数或为两个堆顶元素的均值,或者为数量多的堆的堆顶元素

图示过程

以添加[1,2,3,4,5]为例,展示两个堆的变化过程,初始时,两个堆均为空。
1.添加1,此时minHeap为空,添加到minHeap中
1
2.添加2,2>minHeap的堆顶元素1,添加到minHeap中,此时minHeap中的元素数量为2,maxHeap中的元素数量为0,数量差大于1,所以minHeap移除堆顶元素,放入maxHeap中
2
3.添加3,3>minHeap的堆顶元素2,添加到minHeap中,此时minHeap中的元素数量为2,maxHeap中的元素数量为1,数量差等于1,无需再操作
3
4.添加4,4>minHeap的堆顶元素2,添加到minHeap中,此时minHeap中的元素数量为3,maxHeap中的元素数量为1,数量差大于1,所以minHeap移除堆顶元素,放入maxHeap中
4
5.添加5,5>minHeap的堆顶元素3,添加到minHeap中,此时minHeap中的元素数量为3,maxHeap中的元素数量为2,数量差等于1,无需再操作
5
此时,两个堆的元素数量相差1,中位数为两个堆的堆顶元素均值

代码实现

class MedianFinder {PriorityQueue<Integer> minHeap;PriorityQueue<Integer> maxHeap;public MedianFinder() {minHeap = new PriorityQueue<Integer>((a, b) -> a - b);maxHeap = new PriorityQueue<Integer>((a, b) -> b - a);}public void addNum(int num) {if (minHeap.isEmpty() || num > minHeap.peek()) {minHeap.offer(num);if (minHeap.size() - maxHeap.size() > 1) {maxHeap.offer(minHeap.poll());}} else {maxHeap.offer(num);if (maxHeap.size() - minHeap.size() > 1) {minHeap.offer(maxHeap.poll());}}}public double findMedian() {if (minHeap.size() == maxHeap.size()) {return (minHeap.peek() + maxHeap.peek()) / 2.0;}else{return minHeap.size()>maxHeap.size()? minHeap.peek() : maxHeap.peek();}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型的实践应用8-利用PEFT和LoRa技术微调大模型(LLM)的原理介绍与指南

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用8-利用PEFT和LoRa技术微调大模型(LLM)的原理介绍与指南,2023年是大语言模型爆发的元年,在我国大语言模型分布就有上百种,随着人工智能技术的不断发展,对于GPT这样的大型语言模型的规模只会变得越来越大。随着模型规…

yolov8-seg 分割推理流程

目录 一、分割检测 二、图像预处理 二、推理 三、后处理与可视化 3.1、后处理 3.2、mask可视化 四、完整pytorch代码 一、分割检测 注&#xff1a;本篇只是阐述推理流程&#xff0c;tensorrt实现后续跟进。 yolov8-pose的tensorrt部署代码稍后更新&#xff0c;还是在仓…

探索数字化转型项目的基础

从消费品到特种化学品&#xff0c;数字化转型正在各行各业中逐渐普及。然而&#xff0c;尽管使用智能化设备、连接解决方案和数据分析对改造升级制造运营模式有巨大帮助&#xff0c;但起步过程&#xff08;奠定一个良好的基础来支撑工厂的可访问性、可靠性、可维护性、可扩展性…

java中IO知识点概念

这里写自定义目录标题 内存中的数据以电子信号的形式表示&#xff0c;而磁盘中的数据是以磁场的方向表示。1.流的分类2.File类3.流的API 关键4.理解缓冲的作用-一次性多拿些读写文件的时候为什么要有缓冲流 -意义是什么缓冲流的使用 5.路径问题6.文件的创建7.内存和磁盘存储本质…

【3D程序软件】SideFX与上海道宁一直为设计师提供程序化 3D动画和视觉效果工具,旨在创造高质量的电影效果

Houdini是一个 从头开始构建的程序系统 使艺术家能够自由工作 创建多次迭代 并与同事快速共享工作流程 Houdini FX为 视觉特效艺术家创作故事片 广告或视频游戏 凭借其基于程序节点的工作流程 Houdini FX可让 您更快地创建更多内容 从而缩短时间并 在所有创意任务中…

ESP Multi-Room Music 方案:支持音频实时同步播放 实现音乐互联共享

项目背景 随着无线通信技术的发展&#xff0c;针对不同音频应用领域的无线音频产品正不断涌现。近日&#xff0c;乐鑫科技推出了基于 Wi-Fi 的多扬声器互联共享音乐通信协议——ESP Multi-Room Music 方案。该方案使用乐鑫自研的基于 Wi-Fi 局域网的音频同步播放技术&#xff…

51单片机使用串口查看程序执行的数据

51单片机使用串口查看程序执行的数据 1.概述 这篇文章介绍利用串口输出程序执行的数据&#xff0c;辅助我们调试程序&#xff0c;提高代码定位问题的效率。 2.硬件电路原理 3.串口助手查看程序数据 输出串口数据的方式分为CPU查询方式和中断方式。他们各有优缺点&#xff0…

源码剖析 Spring Security 的实现原理

Spring Security 是一个轻量级的安全框架&#xff0c;可以和 Spring 项目很好地集成&#xff0c;提供了丰富的身份认证和授权相关的功能&#xff0c;而且还能防止一些常见的网络攻击。我在工作中有很多项目都使用了 Spring Security 框架&#xff0c;但基本上都是浅尝辄止&…

springboot(ssm健身器材用品网 健身用品商城Java(codeLW)

开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数据库工具&#xff1a;Navicat 开发软件&#xff1a;ecl…

Java 8 中 ReentrantLock 与 Synchronized 的区别

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

《微信小程序开发从入门到实战》学习三十五

4.2 云开发JSON数据库 4.2.3 权限控制 在云开发控制台可以对数据库中的数据进行操作&#xff0c; 在小程序端和云函数可以分别使用小程序API和服务端API对数据中的数据进行操作。 以上操作受到权限控制。 对数据库进行查询属于读操作&#xff0c;增删改操作属于写操作。 …

Day44力扣打卡

打卡记录 给小朋友们分糖果 II&#xff08;容斥原理 隔板法&#xff09; 链接 def c2(n):return n * (n - 1) // 2 if n > 1 else 0class Solution:def distributeCandies(self, n: int, limit: int) -> int:return c2(n 2) - 3 * c2(n - limit 1) 3 * c2(n - 2 * …

Python实现byte数或者整数的循环位移

文章目录 1 Introduction2 Code2.1 Output2.2 复杂度分析 参考资料 Bit Rotation: A rotation (or circular shift) is an operation similar to a shift except that the bits that fall off at one end are put back to the other end. In the left rotation, the bits that …

结构体训练

1. 评委打分 【问题描述】 校园卡拉OK比赛设置了7名评委&#xff0c;当一名选手K完歌之后&#xff0c;主持人报出歌手名字后&#xff0c;7位评委同时亮分&#xff0c;按照惯例&#xff0c;去掉一个最高分和一个最低分后&#xff0c;其余5位评委评分总和为该选手的最终得分。 一…

uniapp+微信小程序监听返回事件

代码附在最后 适用场景&#xff1a;uniapp开发微信小程序 需求是我点击列表进入数据信息的详情界面&#xff0c;点击详情界面的收藏&#xff0c;返回上一界面后&#xff0c;更新列表中的收藏情况。 目录 一、使用onUnload监听页面卸载 二、使用getCurrentPages()获取当前页…

【双指针】四数之和

四数之和 建议做过了解三数之和的思想再做这道题&#xff0c;思路是一样的~ 题目描述 18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [num…

搞定ESD(六):静电放电问题典型案例分析(一)

文章目录 一、接触放电测试出现系统自动待机问题案例分析(一)1. 问题现象描述2. 问题现象分析3. 问题分析验证过程3.1 MCU芯片供电电源稳定性分析验证3.2 MCU芯片复位电路稳定性验证4. 问题分析产生原因分析5. 问题解决方案6. 案例总结二、接触放电测试出现系统自动待机问题案…

Java大型智慧工地APP云平台源码带AI智能识别功能

智慧工地为建筑全生命周期赋能&#xff0c;用创新的可视化与智能化方法&#xff0c;降低成本&#xff0c;创造价值。 一、智慧工地APP概述 智慧工地”立足于互联网&#xff0c;采用云计算&#xff0c;大数据和物联网等技术手段&#xff0c;针对当前建筑行业的特点&#xff0c;…

让KVM支持滚动热升级:Multi-KVM

Multi-KVM 允许多个独立的 KVM 模块在同一台 Linux 主机上同时加载、卸载和运行。主要包括&#xff1a; 升级和回滚 KVM&#xff0c;而不会中断正在运行的虚拟机 允许在同一主机上运行具有不同参数的 KVM 模块 为 KVM 的 A/B 测试提供便利 1. 设计方案 隔离性 从整个内核中…

C语言 移位操作符

<< 左移操作符>> 右移操作符 注&#xff1a;移位操作符的操作数只能是整数。 移位操作符移动的是二进制位。 整数的二进制表示有3种&#xff1a; 原码反码补码 正的整数的原码、反码、补码相同。 负的整数的原码、反码、补码是要计算的。 由负整数原码计算出反…