算法通关村14关 | 堆结构

1. 堆的概念与特征

堆是将一组数据按照完全二叉树的存储顺序,将数据存储在一维数组中的结构,对的结构有两种,一种称为大顶堆,一种称为小顶堆。

  • 小顶堆:任意节点的值均小于等于它的左右孩子,并且最小的值位于堆顶,即根节点处
  • 大顶堆:任意节点的值均大于等于它的左右孩子,并且最大的值位于堆顶,即根节点处

也可称为大根堆,小根堆,或者最大堆,最小堆,

假设一个节点的下标为i。

  1. 当i = 0时,为根节点。
  2. 当i >= 1时,父节点为(i - 1) / 2。

有些地方叫做堆,有些地方叫做队列,两者到底是什么关系?

优先队列:就是一种队列,它的工作是poll()/peek()出队列中最大、最小的那个元素,所以叫带有优先级的队列。能够实现优先功能的队列不一定只有堆,例如二项堆、平衡树、线段树、c++会用二进制分组的vector来实现一个优先队列。

堆:堆是一个很大的概念,他并不一定是完全二叉树,用完全二叉树是因为这个容易被数组存储,但除了二叉堆之外,我们还有二项堆,斐波那契堆,这种不属于二叉树。

2. 对的构造过程

使用数组构建堆,按照层次将所有元素依次填入二叉树中,使其成为二叉树,然后不断调整,使其最终符合堆结构。

将元素依次排列到完全二叉树上去,如下图所示。

  1. int i = (size - 2) / 2 = 4(思考一下这里为什么是size-2而不是size -1)。找到数组中的4号下标。65大于其孩子,满足最大堆性质,不用交换。
  2. 然后 i = i - 1;用2和其孩子比较,2和204交换。交换之后满足最大堆,如下图左
  3. 54和其孩子比较,54和92交换,92所在子树满足最大堆,如下图右。
  4. 23和其孩子比较,23和204交换,交换完之后,23的子树却不满足了,还需要调整其子树,如下两图
  5. 12和204交换,仍然出现不平衡情况,继续调整子树。直到根节点满足要求。

这样就建成了一个大顶堆,根元素是最大的那个

3. 插入操作

插入300,将其按顺序插入到31的右孩子位置,然后不断向上爬,31<300,所以两者交换,再向上发现300比65大,交换,300>204,交换,最后就是最新堆。

4. 删除操作

        堆中的数据特殊,对堆中数据进行的操作都是针对堆顶的元素,即每次从堆顶获取的最大值或最小值,其他的不关心,所以删除的时候,也是删除堆顶。删除堆顶整个结构会被破坏,需要再次调整。如果直接删除堆顶,群龙无首就不易管理了。实际策略是将队中的最后 一个元素与根元素交换,然后再删除堆的最后一个元素。之后再交换调最大堆,直到堆顶元素满足最大堆性质。

交换完成之后

关于堆的使用口诀

查找:找大用小,大的进;找小用大,小的进。

排序:升序用小,降序用大。

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

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

相关文章

数据通信——传输层TCP(可靠传输原理的ARQ)

引言 上一篇讲述了停止等待协议的工作流程&#xff0c;在最后提到了ARQ自动请求重传机制。接下来&#xff0c;我们就接着上一篇的篇幅&#xff0c;讲一下ARQ这个机制 还是这个图来镇楼 ARQ是什么&#xff1f; 发送端对出错的数据帧进行重传是自动进行的&#xff0c;因而这种…

【iOS】折叠cell

文章目录 前言一、实现效果二、折叠cell的实现原理三、实现折叠cell的高度变化四、实现选中点击的单元格总结 前言 在暑假的3GShare中用到了折叠cell控件&#xff0c;特此总结博客记录 一、实现效果 二、折叠cell的实现原理 首先我们需要知道ScrollView的是TableView的父类&a…

Java从入门到精通-流程控制(一)

流程控制 1.复合语句 复合语句&#xff0c;也称为代码块&#xff0c;是一组Java语句&#xff0c;用大括号 {} 括起来&#xff0c;它们可以被视为单个语句。复合语句通常用于以下情况&#xff1a; - 在控制结构&#xff08;如条件语句和循环&#xff09;中包含多个语句。 - …

肖sir__linux详解__002(系统命令)

linux系统命令 1、df 查看磁盘使用情况 &#xff08;1&#xff09;df 查看磁盘使用情况&#xff08;按kb单位显示&#xff09; &#xff08;2&#xff09;df -h 按单位显示磁盘使用情况 2、top 实时查看动态进程 &#xff08;1&#xff09;top 详解&#xff1a; 第一行&…

Python网络编程详解

概要 Python作为一种强大的编程语言&#xff0c;拥有丰富的网络编程库和框架&#xff0c;能够方便地进行各种网络编程任务。本文将介绍Python网络编程的基础知识&#xff0c;包括socket编程和HTTP协议&#xff0c;然后深入探讨一些流行的Python Web框架&#xff0c;包括Flask和…

Android JNI系列详解之ndk编译工具环境变量配置

一、前提 之前是只介绍了CMake编译工具的使用&#xff0c;现在介绍另一种原生&#xff08;NDK自带的脚本工具&#xff09;自带的编译方式&#xff1a;ndk-build&#xff0c;想要使用ndk-build编译工程&#xff0c;我们需要配置全局的环境变量。 二、配置环境变量 找到ndk在电脑…

2023腾讯全球数字生态大会预约报名入口

报名入口 2023腾讯全球数字生态大会即将开启&#xff0c;点击打开预约报名入口。 主题与介绍 主题 2023腾讯全球数字生态大会将聚焦产业未来发展新趋势&#xff0c;针对云计算、大数据、人工智能、安全、SaaS等核心数字化工具做关键进展发布&#xff0c;并联合生态伙伴推出最…

合宙Air724UG LuatOS-Air LVGL API控件--日历 (Calendar)

日历 (Calendar) LVGL 提供了一个用来选择和显示当前日期的日历控件。 示例代码 – 高亮显示的日期 highlightDate lvgl.calendar_date_t() – 日历点击的回调函数 – 将点击日期设置高亮 function event_handler(obj, event) if event lvgl.EVENT_VALUE_CHANGED then da…

WIFI与BT的PCB布局布线注意事项

1、模块整体布局时&#xff0c;WIFI模组要尽量远离DDR、HDMI、USB、LCD电路以及喇叭等易干扰模块或连接座&#xff1b; 2、晶体电路布局需要优先考虑&#xff0c;布局时应与芯片在同一层并尽量靠近放置以避免打过孔&#xff0c;晶体走线尽可能的短&#xff0c;远离干扰源&…

C# 跨线程访问窗体控件

在不加任何修饰的情况下&#xff0c;C# 默认不允许跨线程访问控件&#xff0c;实际在项目开发过程中&#xff0c;经常使用跨线程操作控件属性&#xff0c;需要设置相关属性才能正确使用&#xff0c;两种方法设置如下&#xff1a; 方法1&#xff1a;告诉编译器取消跨线程访问检…

视频汇聚/视频云存储/视频监控管理平台EasyCVR视频平台添加萤火云设备的具体操作步骤

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

CData Drivers for SAS xpt Crack

CData Drivers for SAS xpt Crack 使用基于标准的驱动程序&#xff0c;加入数据库、报告工具和自定义程序中的实时SAS xpt(XPORT)数据文件。 与BI分析、报告、ETL工具和自定义解决方案集成。 适用于SAS xpt的CData驱动程序。神奇的功能&#xff1a; BI和分析 我们的驱动程序是将…

电子科大软件系统架构设计——系统分析与设计概述(含课堂作业、练习答案)

系统分析与设计概述 信息系统概述 what 信息系统是一种能够完成对业务数据进行采集、转换、加工、计算、分析、传输、维护等信息处理&#xff0c;并能就某个方面问题给用户提供信息服务的计算机应用系统。 组成 信息化基础设施&#xff08;计算机、计算机网络、服务器、系统…

零信任安全模型详解:探讨零信任安全策略的原理、实施方法和最佳实践,确保在网络中实现最小特权原则

在当今日益复杂和危险的网络环境中&#xff0c;传统的网络安全模型已经不再能够满足对抗不断进化的威胁。零信任安全模型应运而生&#xff0c;以其强调“不信任&#xff0c;始终验证”的理念&#xff0c;成为了当今信息技术领域中的热门话题。本文将深入探讨零信任安全模型&…

JVM内存模型介绍

java内存中变量的存储位置 局部变量&#xff1a;方法中的局部变量存在于栈内存。每当程序调用一个方法时&#xff0c;系统都会为该方法建立一个方法栈&#xff0c;所在方法中声明的变量就放在方法栈中&#xff0c;方法结束系统会销毁该方法栈&#xff0c;在该方法中声明的变量随…

基础知识回顾:借助 SSL/TLS 和 NGINX 进行 Web 流量加密

原文作者&#xff1a; Robert Haynes 原文链接&#xff1a; 基础知识回顾&#xff1a;借助 SSL/TLS 和 NGINX 进行 Web 流量加密 NGINX 唯一中文官方社区 &#xff0c;尽在 nginx.org.cn 网络攻击者肆无忌惮、作恶多端&#xff0c;几乎每天都有网络入侵、数据窃取或勒索软件攻击…

华为eNSP模拟器中,路由器如何添加serial接口

在ensp模拟器中新建拓扑后&#xff0c;添加2个路由器。 在路由器图标上单击鼠标右键&#xff0c;选择设置选项。 在【视图】选项卡的【eNSP支持的接口卡】窗口查找serial接口卡。 选择2SA接口卡&#xff0c;将其拖动到路由器空置的卡槽位。 如上图所示&#xff0c;已经完成路由…

【LeetCode题目详解】第八章 贪心算法 part05 435. 无重叠区间 763.划分字母区间 56. 合并区间 (day36补)

本文章代码以c为例&#xff01; 一、力扣第435题&#xff1a;无重叠区间 题目&#xff1a; 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。 示例 1: 输入: intervals [[1,…

Python爬虫乱码问题之encoding和apparent_encoding的区别

encoding是从http中的header中的charset字段中提取的编码方式&#xff0c;若header中没有charset字段则默认为ISO-8859-1编码模式&#xff0c;则无法解析中文&#xff0c;这是乱码的原因 apparent_encoding会从网页的内容中分析网页编码的方式&#xff0c;所以apparent_encodi…

学生信息管理系统MIS(前端)

改造HTML文件 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>学生信息管理系统MIS</title><!-- link在HTML文件中,引入外部的css文件 rel的值是固定写法,stylesheet样式表href用来指定样式表的位置--><lin…