数据结构学习记录——什么是堆(优先队列、堆的概念、最大堆最小堆、优先队列的完全二叉树表示、堆的特性、堆的抽象数据类型描述)

news2024/11/24 18:43:32

目录

优先队列

若采用数组或链表实现优先队列 

数组

链表

有序数组

有序链表

总结

若采用二叉搜索树来实现优先队列

最大堆

堆的概念

优先队列的完全二叉树表示

堆的两个特性 

结构性

有序性

【例】最大堆和最小堆

【例】不是堆

堆的抽象数据类型描述


优先队列

优先队列(Priority Queue):

特殊的“队列”,取出元素的顺序是依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。

若采用数组或链表实现优先队列 

数组

插入操作——元素总是插入尾部        ~ O(1)

删除操作——查找最大(或最小) 关键字        ~ O(n)

                        从数组中删去需要移动的元素        ~ O(n)


插入操作的时间复杂度为O(1),只需要将元素插入到数组的末尾即可。

但是删除操作的时间复杂度为O(n),因为需要找到优先级最高的元素,这可能需要遍历整个数组。

链表

插入操作——元素总是插入链表的头部        ~ O(1)

删除操作——查找最大(或最小)关键字        ~ O(n)

                        删去结点        ~ O(1)


插入操作的时间复杂度为O(1),同样只需要在链表末尾插入一个节点即可。

而删除操作时,查找最大(或最小)关键字可能需要遍历整个链表再进行删除,所以时间复杂度为O(n)。

有序数组

插入操作——找到合适的位置        ~ O(n)O({log_{2}}^{n})

                        移动元素并插入        ~ O(n)

删除操作——删去最后一个元素        ~ O(1)


采用有序数组使得优先队列在删除时方便了很多,但是在插入时却同样会变得十分麻烦,要找到合适的位置进行插入,再移动元素。

有序链表

插入操作——找到合适的位置        ~ O(n)

                        插入元素        ~ O(1)

删除操作——删除首元素或最后元素        ~ O(1)


除了在插入时不用移动元素,有序链表与有序数组基本相同。

总结

给出的这四个方案中,总有存在不足。要么是提高了插入操作的效率,删除操作的效率十分低;要么是提高了删除操作的效率,而插入操作的效率十分低。

所以我们要想用一种新的方式来存储:二叉树

若采用二叉搜索树来实现优先队列

通过前面的学习,我们了解到:

在二叉搜索树中,每个结点都有一个键值,且左子树中的所有结点的键值小于该结点的键值,右子树中的所有结点的键值大于该结点的键值。

因此,可以将优先级作为键值,将元素作为结点存储在二叉搜索树中。

在插入元素时,根据元素的优先级将其插入到正确的位置。

在删除元素时,可以删除具有最高优先级的元素,即最大元素或最小元素。

但是,

当我们连续删除最大值或者连续删除最小值时,这棵二叉搜索树会变得越来越斜,二叉搜索树的插入和删除操作的时间复杂度可能会退化为O(n)。达不到我们要求的高效率了。

所以,我们要思考:采用二叉树的结构来实现这个优先队列的话,要更应该关注插入操作还是删除操作?

最大堆

很显然,采用二叉树结构来实现优先队列时,更应该关注的是删除操作,连续不断地删除二叉搜索树的最值的话,会使得其越来越不平衡。

那么就不删除左右子树,改为删除根结点。

我们把最大值放在根结点上,要删除最大值时直接删除根结点即可。

故而有一个原则:任何一个结点,都是以它为根的这个子树的最大值。

那么满足这个原则的结构,我们称它为最大堆。

为了是这个二叉树能够平衡一点,我们在实现时,最好的方法应该是使用完全二叉树

我们引出堆的概念:

堆的概念

堆是一种特殊的树形结构,其中每个结点都有一个值,通常称为“键值”,并且每个结点的键值都满足一定的条件

其中具有最高(或最低)优先级的元素总是位于堆的根结点

堆可以分为最大堆和最小堆

最大堆中父结点的键值总是大于或等于任何一个子结点的键值,

而最小堆中父结点的键值总是小于或等于任何一个子结点的键值。

而堆的一个特点就是用完全二叉树来存储。 

优先队列的完全二叉树表示

堆的两个特性 

结构性

用数组表示的完全二叉树。

有序性

任一结点的关键字是其子树所有结点的最大值(或最小值)

  • 最大堆(MaxHeap)”,也称“大顶堆”:最大值
  • 最小堆(MinHeap)”,也称“小顶堆”:最小值

【例】最大堆和最小堆

【例】不是堆

 

堆的抽象数据类型描述

类型名称:最大堆(MaxHeap)

数据对象集:完全二叉树,每个结点的元素值不小于其自子结点的元素值

操作集:最大堆H\inMaxHeap,元素item\inElementType,主要操作有:

  • MaxHeap Create(int MaxSize):创建一个空的最大堆。
  • Boolean IsFull(MaxHeap H):判断最大堆H是否已满。
  • Insert(MaxHeap H,ElementType item):将元素item插入最大堆H。
  • Boolean IsEmpty(MaxHeap H):判断最大堆H是否为空。
  • ElementType DeleteMax(MaxHeap H):返回H中最大元素(高优先级)。

 


end 


学习自:MOOC数据结构——陈越、何钦铭

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

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

相关文章

安排超市 -- BFS分割搜索

4.安排超市 给定一个n*n的地图。地图是上下左右四联通的,不能斜向行走: *代表障碍,不可通行。 .代表路,可以通行。 #代表房子。房子也是可以通行的。 小红现在需要在一些地方安排一些超市(不能安排在障碍物上&#xf…

山东专升本计算机第七章-计算机网络基础

计算机网络基础 计算机网络系统 考点 6 计算机网络硬件 主体设备 • 称为主机 • 一般可分为中心站(又称服务器)和工作站(客户机) 连接设备 • 网卡 • 工作在数据链路层 • 网卡又称网络适配器,是连接主机和网…

【C++初阶】引用

一.概念 引用就是取别名,在语法上它不会开空间,而是和它引用的变量共用同一块空间。对引用的操作也就是对原来变量的操作。就像现实生活中给人取外号一样,不管是喊外号还是本名,指的都是那个人。 二.引用特性 1.引用类型必须和引用…

Java8 新特性讲解

一、Lambda表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。 二、函数式接口 &#…

【网课平台】Day15.Devops:持续集成与持续交付

文章目录 一、Devops1、什么是Devops2、什么是CI/CD3、Devops方案参考 二、人工部署1、项目打jar包2、生成镜像、创建容器 三、自动化部署1、代码提交到git2、修改pom.xml文件3、前端部署 一、Devops 1、什么是Devops 一个软件的生命周期包括:需求分析阶、设计、开…

SpringCloud:ElasticSearch之集群

单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点单点故障问题:将分片数据在不同节…

【原创】运维的终点是开发~chatGPT告诉你真相

文章目录 软件技术岗位鄙视链,你在哪层呢?让chatGPT告诉你运维工作好,还是开发工作好问它几个问题1. 一个三年运维成长的案例和薪资2. 一个三年开发成长的案例和薪资3. 一个五年运维成长的案例和薪资4. 一个五年开发成长的案例和薪资5. 一个十…

云分析迁移:顺应需求

云提供了对新分析功能、工具和生态系统的访问,可以快速利用这些功能、工具和生态系统来测试、试点和推出新产品。然而,尽管迫在眉睫,但企业在将分析迁移到云时仍感到担忧。组织正在寻找能够帮助他们分配资源和集成业务流程的服务提供商&#…

Linux 服务器上安装和使用 Redis,只需这 4 步!

一、使用 yum 安装 Redis 使用以下命令,直接将 redis 安装到 linux 服务器: yum -y install redis 二、配置远程连接 a)首先第一步,将 redis 配置文件下载到本地(如果你熟悉 vim 操作,直接用 vim 编辑即可…

论文阅读《PIDNet: A Real-time Semantic Segmentation Network Inspired by PID》

论文地址:https://arxiv.org/pdf/2206.02066.pdf 源码地址:https://github.com/XuJiacong/PIDNet 概述 针对双分支模型在语义分割任务上直接融合高分辨率的细节信息与低频的上下文信息过程中细节特征会被上下文信息掩盖的问题,提出了一种新的…

【五一创作】Springboot+多环境+多数据源(MySQL+Phoenix)配置及查询(多知识点)

文章目录 1. 背景2. 技术点3 子模块依赖SpringBoot设置4. 多环境配置4.1 application.yml4.2 application-pro.yml 5. 多数据源配置5.1 yml配置5.2 自定义数据源在Java中配置5.2.1 PhoenixDataSourceConfig5.2.2 MysqlDataSourceConfig 6. 完整的Pom6. 测试6.1 Mapper配置6.2 方…

字符、块、网络设备

设备模型(的意义) 降低设备多样性带来的Linux驱动开发的复杂度,以及设备热拔插处理、电源管理等,Linux内核提出了设备模型概念。设备模型将硬件设备归纳、分类,然后抽象出一套标准的数据结构和接口。驱动的开发&#…

Java项目上线之云服务器环境篇(四)——Redis的安装与配置

Java项目上线之云服务器环境篇(四)——Redis的安装与配置 在我们的项目里可能会用到Redis缓存,需要对Redis进行简单的配置。 1、我们的redis最好放在一个事先安装好的文件夹里,这样更方便于管理。 例如: redis我是放在…

前端开发:JS的事件循环执行机制详解

前言 在前端开发中,涉及到JS原生的使用原理是非常重要的知识点,尤其是在实际工作过程中会遇到各种复杂的业务需求场景,以及具体开发中可能会遇到一些涉及基于JS原理的使用,这都要求开发者能够很好的了解和掌握JS原生的常用原理。J…

jvm之类加载器

写在前面 当我们通过javac命令将java源代码编译为Java字节码后,必须通过类加载器将其加载到jvm中才能运行,所以类加载器是jvm中非常重要的一个组成部分,本文我们就一起来看下吧! 1:类的生命周期 类的生命周期如下图…

leetcode刷题之回文链表and最长回文子串

234.回文链表 方法一:找中间结点,断开链表,后一段链表进行反转 思路:①找中间结点:使用快慢指针fast,slow,fast每次走两个,slow每次走一个; 如果链表的个数是奇数个,那么最后slow指向中间节点 如果链表的个数是偶数个,那么最后slow指向中间两个节点的后一个 ②使用prev指针保…

文心一言 VS chatgpt (13)-- 算法导论3.1 8题 3.2 1题

八、可以扩展我们的记号到有两个参数n和m的情形,其中的n和m可以按不同速率独立地趋于无穷。对于给定的函数g(n, m),用O(g(n, m))来表示以下函数集: O(g(n, m)) { f(n, m): 存在正常量c、和,使得对所有n>n0或m>m0&#xff…

unity 性能优化之合批和剔除

批次对渲染的性能影响是比较大的,批次过多会导致cpu提交的次数过多,导致每帧渲染时间过长,所以我们需要对其优化,减少Bathches数量和SetPassCall次数。 批次合并的方法有多种,下面一一列出: 手动合批 将相…

CRM系统多少钱一套?盘点主流各大CRM系统价格

阅读本文你将了解:1.CRM定价规则;2.各大CRM系统报价(CRM系统多少钱一套);3.CRM系统费用构成。 一、CRM定价规则 很多企业都寻求使用CRM系统来管理客户关系,从而优化管理流程,提升业绩。 对于企业而言&…

1985-2021年全国31省一二三产业就业人数/各省分产业就业人数数据(无缺失)

1985-2021年全国31省一二三产业就业人数/各省分产业就业人数数据(无缺失) 1、时间:1985-2021年 2、范围:包括全国31省 3、来源:各省NJ、社会统计NJ、人口和就业NJ 4、指标包括:省第一产业就业人数、省第…