算法通关村第14关【青铜】| 什么是堆

2023-09-18 14:42:22

1.堆的概念

堆(Heap)

  • 堆是一种特殊的树状数据结构,通常用于实现优先队列和相关算法。
  • 堆分为最大堆(Max Heap)和最小堆(Min Heap)两种类型,具体取决于根节点的值与子节点的关系。在最大堆中,根节点的值最大,而在最小堆中,根节点的值最小。
  • 堆具有以下特性:
    • 它是一个完全二叉树,通常使用数组来表示。
    • 在最大堆中,每个节点的值都大于或等于其子节点的值。
    • 在最小堆中,每个节点的值都小于或等于其子节点的值。
  • 堆支持基本操作,如插入(将新元素插入堆中)、删除最大/最小元素(取出根节点,并调整堆结构以保持堆属性),以及堆排序等。

 2.堆的构造

以下是构造最大堆的一般步骤:

  1. 从最后一个非叶子节点开始:最后一个非叶子节点是位于数组中的索引 (n/2 - 1),其中 n 是堆中元素的数量。这是因为在一个堆中,叶子节点已经满足堆性质,只需要调整非叶子节点。

  2. 下沉操作:从最后一个非叶子节点开始,对每个节点执行下沉操作。下沉操作是指将当前节点与其子节点中较大(或较小,具体取决于堆类型)的节点交换,以确保节点满足堆性质。这个过程会递归地向下进行,直到整个堆满足堆性质。

  3. 重复步骤 2:继续从前一个非叶子节点向前移动,每次都执行下沉操作,直到到达堆的根节点(索引为0)。

下面是一个简单的示例,展示如何将数组构造为最大堆:

假设初始数组:[4, 10, 3, 5, 1]

  1. 从最后一个非叶子节点开始,也就是索引1(10),执行下沉操作,将10与其子节点中较大的数(5)交换,得到:[4, 5, 3, 10, 1]

  2. 继续向前,处理索引0的元素(4),执行下沉操作,将4与其子节点中较大的数(5)交换,得到最终的最大堆:[5, 4, 3, 10, 1]

构造最小堆的过程类似,只不过在下沉操作中会选择较小的子节点来交换。

总之,构造堆的过程是通过逐步调整堆中元素的顺序,使其满足堆性质。这个过程的时间复杂度通常为 O(n),其中 n 是堆中元素的数量。

3.堆的插入

  1. 将新元素添加到堆的底部:首先,将新元素插入到堆的底部,即数组的末尾。

  2. 执行上浮操作:然后,对新插入的元素执行上浮操作。上浮操作是指将当前节点与其父节点进行比较,如果当前节点比父节点大(或小,根据堆的类型不同),则交换它们,直到整个堆满足堆性质。

  3. 重复步骤 2:重复执行上浮操作,直到新元素到达合适的位置并满足堆性质。

下面是一个简单的示例,展示如何向最大堆中插入一个元素:

假设初始最大堆:[5, 4, 3, 2, 1],现在要插入元素6。

  1. 将元素6添加到堆的底部,得到:[5, 4, 3, 2, 1, 6]

  2. 对新插入的元素6执行上浮操作。6比其父节点5大,所以交换它们,得到:[6, 4, 5, 2, 1, 3]

  3. 再次执行上浮操作,直到元素6到达堆中合适的位置。最终得到满足堆性质的最大堆:[6, 4, 5, 2, 1, 3]

这样,就成功将元素6插入到了最大堆中,并保持了堆的性质。

插入操作的时间复杂度通常为 O(log n),其中 n 是堆中元素的数量。这是因为插入操作需要进行一系列的上浮操作,其次数受到堆的高度(树的层数)的影响,通常堆是近似平衡的,因此高度约为 log n。

4.堆的删除

  1. 删除堆顶元素:首先,将堆顶元素(最大值)删除,通常是将它与堆中的最后一个元素交换,并从堆中删除最后一个元素。这样可以确保堆的大小减少1。

  2. 执行下沉操作:接下来,对新的堆顶元素执行下沉操作,也就是将当前节点与其较大的子节点进行比较并交换,直到整个堆再次满足堆性质。

  3. 重复步骤 2:重复执行下沉操作,直到新的堆顶元素到达合适的位置并满足堆性质。

下面是一个简单的示例,展示如何从最大堆中删除最大值:

假设初始最大堆:[6, 4, 5, 2, 1, 3],现在要删除最大值。

  1. 删除堆顶元素6,并将它与堆中的最后一个元素3交换,得到:[3, 4, 5, 2, 1]

  2. 对新的堆顶元素3执行下沉操作。3比其两个子节点4和5小,所以与较大的子节点5交换,得到:[5, 4, 3, 2, 1]

  3. 再次执行下沉操作,直到新的堆顶元素5到达堆中合适的位置并满足堆性质。最终得到满足堆性质的最大堆:[5, 4, 3, 2, 1]

这样,就成功删除了最大堆中的最大值,并保持了堆的性质。

删除操作的时间复杂度通常为 O(log n),其中 n 是堆中元素的数量。这是因为删除操作需要进行一系列的下沉操作,其次数受到堆的高度(树的层数)的影响,通常堆是近似平衡的,因此高度约为 log n。

更多推荐

android px ps dp直接的转换

转换方式看这篇文章:https://blog.csdn.net/sinat_28324227/article/details/50780359下面是ppi一览2.8英寸分辨率为640×480(VGA)像素密度286PPI3.2英寸分辨率为480×320(HVGA)像素密度167PPI3.3英寸分辨率为854×480(W

Linux命令行教程:使用head和tail命令快速查看文件的开头和结尾

文章目录简介A.什么是`head`和`tail`命令B.`head`和`tail`命令的作用和用途`head`命令A.命令格式和语法B.常见选项和参数1.`-n`:指定显示的行数2.`-c`:指定显示的字节数3.`-v`:显示文件名C.示例和应用实例1.显示文件的前几行2.显示多个文件的前几行3.结合管道使用D.注意事

PROFIBUS主站转ETHERCAT协议网关

产品介绍JM-DPM-ECT是自主研发的一款PROFIBUS-DP主站功能的通讯网关。该产品主要功能是将各种PROFIBUS-DP从站接入到ETHERCAT网络中。本网关连接到PROFIBUS总线中作为主站使用,连接到ETHERCAT总线中作为从站使用。产品参数技术参数◆PROFIBUS-DP/V0协议符合GB/T20

《深入PostgreSQL的存储引擎:原理与性能》

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🐅🐾猫头虎建议程序员必备技术栈一览表📖:🛠️全栈技术FullStack:📚MERN/MEAN/MEVNStack|🌐Jamstack|🌍GraphQL|🔁RESTfulAPI|⚡WebSockets|🔄CI/CD|🌐Git&Versio

calibre和cpolar搭建一个私有的网络书库

Kindle中国电子书店停运不要慌,十分钟搭建自己的在线书库随时随地看小说!文章目录Kindle中国电子书店停运不要慌,十分钟搭建自己的在线书库随时随地看小说!1.网络书库软件下载安装2.网络书库服务器设置3.内网穿透工具设置4.公网使用kindle访问内网私人书库6月底,亚马逊公司旗下Kindle中国电子书店停止运营

使用QLoRA对Llama 2进行微调的详细笔记

使用QLoRA对Llama2进行微调是我们常用的一个方法,但是在微调时会遇到各种各样的问题,所以在本文中,将尝试以详细注释的方式给出一些常见问题的答案。这些问题是特定于代码的,大多数注释都是针对所涉及的开源库以及所使用的方法和类的问题。导入库对于大模型,第一件事是又多了一些不熟悉的Python库。!pipinstall

docker network create命令

dockernetworkcreate命令用于创建一个新的网络连接。DRIVER接受内置网络驱动程序的桥接或覆盖。如果安装了第三方或自己的自定义网络驱动程序,则可以在此处指定DRIVER。如果不指定--driver选项,该命令将为您自动创建一个桥接网络。当安装DockerEngine时,会自动创建桥接网络。该网络对应于

Docker基础学习

Docker学习目标:掌握Docker基础知识,能够理解Docker镜像与容器的概念完成Docker安装与启动掌握Docker镜像与容器相关命令掌握TomcatNginx等软件的常用应用的安装掌握docker迁移与备份相关命令能够运用Dockerfile编写创建容器的脚本能够搭建与使用docker私有仓库​1Docke

Say0l的安全开发-代理扫描工具-Sayo-proxyscan【红队工具】

写在前面终于终于,安全开发也练习一年半了,有时间完善一下项目,写写中间踩过的坑。安全开发的系列全部都会上传至github,欢迎使用和star。工具链接地址https://github.com/SAY0l/Sayo-proxyscan工具简介SOCKS4/SOCKS4a/SOCKS5/HTTP/HTTPS快速代理扫描。后

【SpringCloud微服务全家桶学习笔记-服务注册zookeeper/consul】

SpringCloud微服务全家桶学习笔记Eureka服务注册gitee码云仓库9.其他服务注册框架(1)zookeeper安装与使用zookeeper需安装在虚拟机上,建议使用CentOS,安装地址如下:zookeeper镜像源选择第一个进入后下载tar包(第二个为源码文件,想研究源码可下载第二个)下载完成后使用xf

如果模块请求http改为了https,测试方案应该如何制定和修改?

当模块从HTTP切换到HTTPS时,需要制定相应的测试方案来验证系统的功能和安全性。以下是一些建议的测试内容和步骤:功能测试:a.确保模块能够正确地重定向到HTTPS端口。b.验证通过HTTPS访问模块时,是否能够正常加载和展示页面内容。c.检查模块的各种功能和业务逻辑是否能够正常工作。安全性测试:a.验证HTTPS证

热文推荐