堆的插入与删除维护大根堆,为什么需要俩个不同的方法(java)

news/2024/5/21 2:45:00
   public void offer(int val) {//插入操作if(isFull()) {elem = Arrays.copyOf(elem,2*elem.length);}elem[usedSize] = val;usedSize++;//11siftUp(usedSize-1);}public void siftUp(int child) {int parent = (child-1)/2;while (parent >= 0) {if(elem[child] > elem[parent]) {swap(child,parent);child = parent;parent = (child-1)/2;}else {break;}}}public int poll() {//删除操作,将首元素和尾元素互换后维修大根堆if(isEmpty()) {return -1;}int old = elem[0];swap(0,usedSize-1);usedSize--;siftDown(0,usedSize);return old;}public void siftDown(int parent,int end) {int child = 2*parent+1;while (child < end) {if(child+1 < end && elem[child] < elem[child+1]) {child++;}//child下标 就是 左右孩子的最大值if(elem[child] > elem[parent]) {swap(child,parent);parent = child;child = 2*parent+1;}else {break;}}}

在堆(无论是大根堆还是小根堆)的插入和删除操作中,需要两个不同的方法来维护堆的性质。这是因为插入和删除操作对堆的影响不同,因此维护堆性质的方式也不同。

  1. 插入操作(siftUp):

    • 当新的元素被添加到堆的末尾时,它可能破坏堆的性质。因为新元素是最后被添加的,它总是处于叶子节点的位置。
    • 要修复这个问题,我们需要将新元素与其父节点进行比较,并根据需要交换它们的位置。这个过程会一直向上进行,直到新元素到达正确的位置,或者它不再比其父节点大(对于大根堆)。
    • 因此,siftUp 方法是从下往上调整堆的,它确保新插入的元素在堆中正确地“上浮”到合适的位置。
  2. 删除操作(通常是删除堆顶元素,然后siftDown):

    • 当堆顶元素(对于大根堆来说,是最大值)被删除时,我们需要用堆的最后一个元素来替换堆顶的位置,并重新调整堆以保持其性质。
    • 由于新放在堆顶的元素可能小于其子节点,我们需要将它“下沉”到正确的位置。这通常是通过与较大的子节点进行比较和交换来实现的。
    • siftDown 方法是从上往下调整堆的,它确保新放在堆顶的元素在堆中正确地“下沉”到合适的位置。

简而言之,siftUp 和 siftDown 方法的目的是在插入和删除操作后重新调整堆,以确保它仍然满足堆的性质(即父节点的值总是大于或等于其子节点的值,对于大根堆来说)。这两个方法分别处理从底部添加新元素和从顶部删除元素的情况,因此它们的实现方式有所不同。


http://www.mrgr.cn/p/37270856

相关文章

Scrum冲刺4--5.10

Scrum冲刺4--5.10这个作业属于哪个课程 软件工程这个作业要求在哪里 团队项目这个作业的目标 进行敏捷冲刺,熟悉团队合作开发前端仓库 前端后端仓库 后端每次冲刺日志索引时间 博客5.7 Day1ᕙ(`▿)ᕗ5.8 Day2ᕙ(• ॒ ູ•)ᕘ5.9 Day3(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )5.10 Day4 (…

Navicat Data Modeler Ess for Mac:强大的数据库建模设计软件

Navicat Data Modeler Ess for Mac是一款专为Mac用户设计的数据库建模与设计工具&#xff0c;凭借其强大的功能和直观的界面&#xff0c;帮助用户轻松构建和管理复杂的数据库模型。 Navicat Data Modeler Ess for Mac v3.3.17中文直装版下载 这款软件支持多种数据库系统&#x…

敏捷冲刺day3--数字工匠队

这个作业属于哪个课程 软件工程这个作业的要求是什么 项目冲刺这个作业的目标 冲刺日志3站立式会议照片工作困难 处理任务时遇到一些问题需要上网学习花费时间 昨日完成工作 部分登录界面前后端处理代码 今日计划工作 继续完成登录界面前后端处理 项目燃尽图每日总结 邹嘉伟:继…

中国地面气候资料日值数据获取方式

数据简介 环境气象数据服务平台提供了全国大约2100个点位&#xff0c;2000年至2023年的逐日数据。包括气温、气压、湿度、风、降水等要素。 数据基于ECMWF reanalysis-era5-land、reanalysis-era5-single-levels 以及中国2100站点地面气候资料日值观测数据&#xff0c;使用机器…

第 3 篇 Scrum 冲刺博客

每天举行站立式会议 昨天已完成的工作: 今天计划完成的工作: 工作中遇到的困难: 项目燃尽图代码/文档签入记录项目展示每日每人总结 李健宇:明天加油。 陈彦煤:尽力完成,克服困难。

如何使用client-go构建pod web shell

代码示例及原理 原理是利用websocket协议实现对pod的exec登录&#xff0c;利用client-go构造与远程apiserver的长连接&#xff0c;将对pod容器的输入和pod容器的输出重定向到我们的io方法中&#xff0c;从而实现浏览器端的虚拟终端的效果消息体结构如下 type Connection stru…

【c++算法篇】双指针(下)

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;算法笔记仓 朋友们大家好啊&#xff0c;本篇文章我们来到算法的双指针的第二部分 目录 1.有效三角形的个数2.查找总价格为目标值的两个商品3.三数之和4.四数之和5.双指针常见场景总结 1.有效三角形…

移动机器人系统与技术:自动驾驶、移动机器人、旋翼无人机

这本书全面介绍了机器人车辆的技术。它介绍了道路上自动驾驶汽车所需的概念。此外&#xff0c;读者可以在六足机器人的构造、编程和控制方面获得宝贵的知识。 这本书还介绍了几种不同类型旋翼无人机的控制器和空气动力学。它包括各种旋翼推进飞行器在不同空气动力学环境下的模…

ThreeJS:本地部署官网文档与案例

部署方式 部署之前请确保已经配置好node.js环境。 1. 下载ThreeJS源码 ThreeJS的GitHub地址&#xff1a;GitHub - mrdoob/three.js: JavaScript 3D Library.&#xff0c;可以简单查看ThreeJS当前版本&#xff1a;r164&#xff0c; 我们可以选择对应的版本&#xff08;此处为r1…

10秒以上无错误!猫态量子比特稳定性达到新水平

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨 浪味仙 排版丨沛贤 深度好文&#xff1a;1200字丨5分钟阅读 摘要&#xff1a;与涉及超导电路的其他量子比特设计相比&#xff0c;使用猫态量子比特可能会“将用于纠错的量子比特数量减少到…

SpringBoot整合Mybatis时mapper文件和xml文件的位置

xml文件放在resources下看下我的项目目录2.由于放在resurces下就无法扫描到xml文件,所以就需要在配置文件配置--mapper文件位置 mybatis.mapper-locations=classpath:mapper/*.xml 或 mybatis.mapper-locations=classpath:/mapper/*.xmlxml和mapper文件放在一起我的项目目录但…

Flume进阶

目录 第1关&#xff1a;拦截器的使用 第2关&#xff1a;自定义拦截器 第1关&#xff1a;拦截器的使用 代码文件&#xff1a; # Define source, channel, sink #agent名称为a1# Define source #source类型配置为avro,监听8888端口&#xff0c;后台会自动发送数据到该端口 #拦截后…

论文阅读:《Sequence can Secretly Tell You What to Discard》,减少推理阶段的 kv cache

目前各类大模型都支持长文本&#xff0c;例如 kimi chat 以及 gemini pro&#xff0c;都支持 100K 以及更高的上下文长度。但越长的上下文&#xff0c;在推理过程中需要存储的 kv cache 也越多。假设&#xff0c;数据的批次用 b 表示&#xff0c;输入序列的长度仍然用 s 表示&a…

聚观早报 | 苹果新款iPad Pro发布;国产特斯拉4月交付量

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 5月9日消息 苹果新款iPad Pro发布 国产特斯拉4月交付量 iOS 18新功能爆料 真我GT Neo6续航细节 三星Galaxy Z F…

#Scurm冲刺第五天

Scurm冲刺第五天 1. 站立式会议内容昨日已完成任务 今日计划完成任务前端UI设计代码编写(收藏页面,商品详情页,个人中心页) 前端UI设计代码编写(购物车页面,订单页面,订单详情页,搜索后商品展示页),前端界面合理跳转功能实现后端管理员模块功能实现(登录注册功能,用户…

m1_day7

课程内容:数组的排序引用数据类型的数组面向对象封装继承多态数组的排序:手动排序 冒泡排序 *自动排序Arrays.sort(数组对象);只能升序排序import java.util.*;引用数据类型的数组:当我们创建一个引用数据类型的数组的时候 其实里面一个对象都没有 里面都是默认值null 为了防…

数据分析:基于sparcc的co-occurrence网络

介绍 Sparcc是基于16s或metagenomics数据等计算组成数据之间关联关系的算法。通常使用count matrix数据。 安装Sparcc软件 git clone gitgithub.com:JCSzamosi/SparCC3.git export PATH/path/SparCC3:$PATHwhich SparCC.py导入数据 注&#xff1a;使用rarefy抽平的count ma…

『先进技术助力』Kompas AI:智能AI代理在工作中的应用与效率提升

『智能化未来』Kompas AI如何改变我们的工作方式&#xff1f; 在这个信息时代&#xff0c;利用AI聊天机器人来处理机械性的工作已经成为一种趋势。ChatGPT作为一种智能助手&#xff0c;不仅能够提高工作效率&#xff0c;还可以帮助我们更明智地做出决策&#xff0c;从而释放出更…

【视频】多元线性回归模型原理讲解与R语言实例

原文链接:https://tecdat.cn/?p=36149 原文出处:拓端数据部落公众号 分析师:Xue Yang 近年来,随着计量经济学和统计学的快速发展,回归模型作为一种有效的数据分析工具,被广泛应用于金融市场的分析中。回归模型能够通过建立变量之间的数学关系,揭示变量之间的相互作用机…

Python随机波动性SV模型:贝叶斯推断马尔可夫链蒙特卡洛MCMC分析英镑/美元汇率时间序列数据

全文链接:https://tecdat.cn/?p=33885 原文出处:拓端数据部落公众号 本文描述了帮助客户使用马尔可夫链蒙特卡洛(MCMC)方法通过贝叶斯方法估计基本的单变量随机波动模型,就像Kim等人(1998年)所做的那样。 定义模型以及从条件后验中抽取样本的函数的代码也在Python脚本中…