堆的基本概念和插入删除方法的介绍

优先级队列的介绍:

1.1优先级队列:优先级队列是一种特殊的队列数据结构,每个元素都有一个与之关联的优先级,与普通队列不同,优先级队列中的元素是按照优先级顺序进行处理的,而不是简单的插入。

特点:

1.优先级:每个元素都有一个优先级。优先级可以是数值或是其他标识,通常较高的数值表示更高的优先级

2.出队顺序:在优先级队列中,优先级高的元素会被先处理。

堆的介绍:

2.1堆的定义: 堆是一种特殊的树形结构(完全二叉树),主要用于实现优先队列。堆有两种类型:最大堆和最小堆。

堆的性质:

最大堆:每个节点的值大于或等于其子节点的值。 根节点是最大值。

最小堆:每个节点的值小于或等于其子节点的值。根节点是最小值。

2.2: 堆的存储方式:

由于堆是一棵完全二叉树,因此可以层序的规则采用顺序的方式来进行高效存储。

对于非完全二叉树不适合顺序存储,因为为了还原二叉树,需要储存空节点,导致空间利用率下降。

2.3 堆的创建:

如何将上述二叉树创建成堆?

由上图我们可以直到了解,除了根节点外,该完全二叉树左右子树均满足堆的性质(最小堆满足),因此我们只需将根节点向下调整即可。

2.3.1 堆的向下调整(也叫下沉):

1.parent标记需要调整的节点,child标记parent的左孩子(parent如果有孩子,一定是先有左孩子)

2.如果parent的左孩子存在,即child< size,进行以下操作直至parent的左孩子不存在:

    (1): parent的右孩子是否存在,存在,找到左右孩子中最小的那个,让child进行标记。

   (2):  将parent与较小的那个孩子进行比较,如果:

        parent 小于较小的那个孩子child,调整结束。

否则:交换parent 与 较小的孩子child ,交换完成之后,parent中大的那个元素向下移动,可能会导致子树不满足堆的性质,因此需要继续向下调整,即parent = child,child = 2*parent+1;

具体代码如下:

   public void shiftDown(int parent,int UsedSize){int child = 2*parent+1;while(child<usedSize){//找到左右孩子的最大值if(child+1< usedSize && elem[child] < elem[child+1]){child++;}if(array[parent]<= array[child]){break; //满足最小堆的特性}else{//将双亲与最小孩子进行交换位置int t = array[parent];array[parent] = array[child];array[child] = t;//parent的较大元素向下移动可能会导致子树不满足堆的性质,因此还需向下调整parent = child;child = 2*parent+1;}}}

注:在调整以parent为根的二叉树时,必须满足parent的左右子树都已经是根了才能向下调整。

时间复杂度的分析:

最坏的情况即为图示情况,从根一路比较到叶子,比较的次数为完全二叉树的高度,即时间复杂度为O(log2n).

2.3.2 : 堆的创建

对于普通节点,根的左右子树不满足堆的性质,该如何调整?

找到倒数第一个非叶子节点,从该位置往前一直到根节点,遇到一个节点,进行向下调整。

    public void CreatHeap(){int root = (this.usedSize-1-1)/2;for(;root>=0;root--){shiftDown(root,usedSize);}}

2.4  堆的插入和删除:

2.4.1:堆的插入:

思路:

1.将元素放到底层空间中(空间不够时需要扩容)。

2.将最后插入的节点向上调整,直到满足了堆的性质。

向上调整堆:

将插入后的节点向上调整直到满足堆性质。

具体代码如下:(以最小堆为例)

public void offer(int val){if(isFull()){ //堆满了,进行扩容elem = Arrays.copyOf(elem,2*elem.length);}elem[usedSize] = val; //将val插到数组最后一个位置 shiftUp(usedSize);usedSize++; //有效元素个数加1}//向上调整(上移)最小堆:public void shiftUp(int child){//找到child的双亲:int parent = (child-1)/2;while(child>0){//如果双亲比孩子都小,满足最小堆if(array[parent]< array[child]){break;}else{//将双亲与孩子节点进行交换int t = array[parent];array[parent] = array[child];array[child] = t;//小的元素继续向上移动,可能子树不满足堆的性质,继续上移parent = child;child = (child-1)/2;}}}}

2.4.2 堆的删除:

思路:

1.堆的删除删除的一定是堆顶元素。

2.将堆中的有效数据个数-1

3.对堆顶元素进行向下调整

具体代码如下:

   private void swap(int[] elem,int i,int j){int tmp = elem[i];elem[i] = elem[j];elem[j] = tmp;}public int poll(){if(isEmpty()){return -1;}int val = elem[0]; //堆顶元素放到val里swap(elem,0,usedSize-1); //交换堆顶和堆尾元素shiftDown(0,usedSize-1);//首元素下调usedSize--;}public boolean isEmpty(){return usedSize == 0; //空堆}

2.4.3 堆排序(用堆模拟实现优先级队列):

思路:

整个 heapSort 方法的核心思路是利用最大堆的特性,通过反复交换堆顶元素和未排序部分的最后一个元素,并进行下沉调整,最终实现一个有序的数组

具体代码如下:

public void shiftDown2(int parent , int usedSize){ //大根堆int child = 2*parent+1; //获得子树索引while(child< usedSize){if(child+1<usedSize && elem[child]<elem[child+1] ){child++;}if(elem[child] > elem[parent] ){swap(elem,parent,child); //交换双亲结点和孩子节点的位置parent = child; //更新父节点child = 2*parent+1;}else{break;}}}public void heapSort(){int end = usedSize-1;while(end>0){swap(elem,0,end); //交换堆顶堆尾元素shiftDown2(0,end); //交换后将堆顶元素下调end--;//每次迭代减少end,因为最后的元素已经有序}}

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

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

相关文章

雷军:对“雷军语音包”感到不适,希望停止使用

对于社交媒体上频繁出现的“雷军AI语音包”&#xff0c;雷军发声回应。10月29日&#xff0c;雷军发布视频表示&#xff1a;“最近两年AI特别火&#xff0c;技术进步特别得快&#xff0c;前段时间我在刷抖音的时候&#xff0c;经常看到很多人在玩‘雷军AI’&#xff0c;就是雷军…

分布式光伏是什么意思?如何高效管理?

分布式光伏系统是指在用户现场或靠近用电现场配置较小的光伏发电供电系统&#xff0c;以满足特定用户的需求。根据通知&#xff0c;分布式光伏系统主要有以下几类定义&#xff1a; 10kV以下电压等级接入&#xff0c;且单个并网点总装机容量不超过6MW的分布式电源&#xff1a;这…

项目1 yolov5鱼苗检测计数

yolov5鱼苗检测 1. yolov5鱼苗检测1.1. 环境配置1.2 Predict1.3 Validate1.4 Train1.5 生成 ONNX 2 代码解析2.1 模型2.2 数据集2.3 损失函数2.4 训练2.5 预测 之前做的项目&#xff0c;再回顾一下 环境&#xff1a;GPU1卡&#xff0c;CPU4核&#xff0c;每显卡12GB&#xff0c…

智能文档处理平台:免费体验智能化医疗信息提取

前提&#xff1a;医疗行业信息碎片化问题普遍&#xff0c;手工数据录入效率低且易错&#xff0c;导致数据管理难度大。本系统可帮助医疗机构在信息管理上迈向智能化&#xff0c;优化流程并提升效率。 系统概述&#xff1a; 思通数科推出的智能文档处理系统&#xff0c;专为解…

解决edge浏览器无法同步问题

有时候电脑没带&#xff0c;但是浏览器没有同步很烦恼。chrome浏览器的同步很及时在多设备之间能很好使用。但是edge浏览器同步没反应。 在这里插入图片描述 解决方法&#xff1a; 一、进入edge浏览器点击图像会显示未同步。点击“管理个人资料”&#xff0c;进入后点击同步&…

python代码中通过pymobiledevice3访问iOS沙盒目录获取app日志

【背景】 在进行业务操作过程中&#xff0c;即在app上的一些操作&#xff0c;在日志中会有对应的节点&#xff0c;例如&#xff0c;下面是查看设备实时视频过程对应的一些关键节点&#xff1a; 1、TxDeviceAwakeLogicHelper&#xff1a;wakeStart deviceId CxD2BA11000xxxx …

网络编程_day6

目录 【0】复习 并发服务器实现思路梳理 多进程 多线程 IO多路复用select 【1】setsockopt&#xff1a;设置套接字属性 socket属性 设置地址重用 【2】超时检测 必要性 超时检测的设置方法 1. 通过函数自带的参数设置 2. 通过设置套接字属性进行设置 3. alarm函数与sigaction函…

GPT-Sovits-1-数据处理

1.1 切割音频 将音频切割为多个10s内的片段 1.2 降噪 这一步用的是modelscope的pipeline 如果要去除背景音&#xff0c;可以用傅立叶转为为频谱&#xff0c;去除低频部分后再转回来 1.3 提取音频特征 这里用到了 funasr 库 这一步目的是输出音频样本的《文本标签文件》&am…

Linux——常见指令及其权限理解(正在更新中)

1.指令 1.1 快速了解指令 pwd 首次登录&#xff0c;默认所处的路径 whoami 当前所用的用户的名称 ls 显示当前路径下&#xff0c;文件名称 mkdir 在当前目录下&#xff0c;创建一个文件夹/目录 cd 进入一个目录 touch 新建一个文…

Kafka 物理存储机制

优质博文&#xff1a;IT-BLOG-CN 一个商业化消息队列的性能好坏&#xff0c;其文件存储机制设计是衡量一个消息队列服务技术水平和最关键指标之一。下面将从Kafka文件存储机制和物理结构角度&#xff0c;分析Kafka是如何实现高效文件存储&#xff0c;及实际应用效果。Kafka的基…

采用STM32CubeMX和HAL库的定时器应用实例

目录 STM32的通用定时器配置流程 定时器应用的硬件设计 定时器应用的软件设计 1. 通过STM32CubeMX新建工程 通过STM32CubeMX新建工程的步骤如下&#xff1a; 2. 通过Keil MDK实现工程 通过Keil MDK实现工程的步骤如下&#xff1a; STM32的通用定时器配置流程 通用定时器…

【优选算法篇】前缀之序,后缀之章:于数列深处邂逅算法的光与影

文章目录 C 前缀和详解&#xff1a;基础题解与思维分析前言第一章&#xff1a;前缀和基础应用1.1 一维前缀和模板题解法&#xff08;前缀和&#xff09;图解分析C代码实现易错点提示代码解读题目解析总结 1.2 二维前缀和模板题解法&#xff08;二维前缀和&#xff09;图解分析C…

Topaz Video AI for Mac 视频无损放大软件安装教程【保姆级,操作简单轻松上手】

Mac分享吧 文章目录 Topaz Video AI for Mac 视频无损放大软件 安装完成&#xff0c;软件打开效果一、Topaz Video AI 视频无损放大软件 Mac电脑版——v5.3.5⚠️注意事项&#xff1a;1️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件&#xff0c;将安装包从左侧拖入右侧文…

CNAS软件测试的好处有哪些?上海软件测试中心推荐

在进行软件测试或其他项目检测需要选择软件测试中心时&#xff0c;我们常常会把该公司有无资质认证考虑进去。那么CNAS认可作为检测机构或实验室的一项重要资质认证&#xff0c;我们可能会产生疑问&#xff1a;CNAS认可什么意思?CNAS软件测试又有什么好处呢? 1、CNAS认可是什…

【51 Pandas+Pyecharts | 深圳市共享单车数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 处理起始时间、结束时间2.4 增加骑行时长区间列2.5 增加骑行里程区间列 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 各…

AMBA之AXI 总线

AMBA概述 AMBA&#xff08;Advanced Microcontroller Bus Architecture&#xff09;是ARM公司开发的一种高级微控制器总线架构&#xff0c;用于连接处理器、存储器和外设的通信。AMBA总线架构定义了一组协议和接口&#xff0c;用于实现高性能、低功耗、可扩展的系统设计。 AM…

Amcor 如何借助 Liquid UI 实现SAP PM可靠性

背景介绍 安姆科是塑料行业的全球领军企业&#xff0c;该企业认识到 SAP 工厂维护&#xff08;SAP PM&#xff09;对于确保高效的维护管理的重要性。 在诸如制造业等高度依赖机械设备的行业中&#xff0c;SAP PM是一种通过数据驱动决策来最大限度减少停机时间、降低间接成本、…

【C语言】预处理(预编译)详解(下)(C语言最终篇)

文章目录 一、#和##1.#运算符2.##运算符 二、预处理指令#undef三、条件编译1.单分支条件编译2.多分支条件编译3.判断符号是否被定义4.判断符号是否没有被定义 四、头文件的包含1.库头文件的包含2.本地头文件的包含3.嵌套包含头文件的解决方法使用条件编译指令使用预处理指令#pr…

宠物空气净化器哪个牌子好?有没有噪音低的宠物空气净化器推荐?

如今随着社会竞争越来越激烈&#xff0c;不少人开始焦虑内耗&#xff0c;但为了能更好的生活&#xff0c;养宠物便成为不少人的排忧解乏的方法。 我也不例外&#xff0c;作为一名996社畜&#xff0c;天刚亮就出门&#xff0c;天黑很久才回家&#xff0c;所以选择养猫来陪我度过…

C++设计模式创建型模式———生成器模式

文章目录 一、引言二、生成器/建造者模式三、总结 一、引言 上一篇文章我们介绍了工厂模式&#xff0c;工厂模式的主要特点是生成对象。当对象较简单时&#xff0c;可以使用简单工厂模式或工厂模式&#xff1b;而当对象相对复杂时&#xff0c;则可以选择使用抽象工厂模式。 工…