数据结构之<堆>的介绍

1.简介


堆是一种特殊的数据结构,通常用于实现优先队列。堆是一个可以被看作近似完全二叉树的结构,并且具有一些特殊的性质,根据这些性质,堆被分为最大堆(或者大根堆,大顶堆)和最小堆两种。
在这里插入图片描述

2.基本性质


  1. 完全二叉树结构:堆必须是一棵完全二叉树,即除了最底层,其他层都是满的,而且最底层的节点都尽量靠左排列,最后一行元素之间不可以有间隔。
  2. 堆序性质: 堆分为最大堆和最小堆两种。在最大堆中,任意节点的值都大于或等于其子节点的值;在最小堆中,任意节点的值都小于或等于其子节点的值。

3.节点下标间的规律


因为堆是一棵完全二叉树若父节点的下标为i,则左子节点下标为2i+1,右子节点下标为2i+2,这个规律会在算法排序中经常使用。

4.堆的基本操作


上滤(Percolate Up)

上滤是指在堆中插入新元素后,通过一系列的比较和交换操作将该元素上移到合适的位置,以保持堆的堆序性。通常用于最小堆和最大堆中。

步骤:

  1. 将新元素插入到堆的末尾(底部)。
  2. 比较该元素与其父节点的值。
  3. 如果该元素的值比父节点的值更小(对于最小堆)或更大(对于最大堆),则交换它们。
  4. 重复步骤2和步骤3,直到满足堆的性质为止。
下滤(Percolate Down)

下滤是指在删除堆顶元素后,通过一系列的比较和交换操作将堆的最后一个元素(通常是堆底元素)移到堆顶,并将其下移到合适的位置,以保持堆的堆序性。

步骤:

  1. 将堆的最后一个元素(通常是堆底元素)移到堆顶。
  2. 比较该元素与其子节点中较小(对于最小堆)或较大(对于最大堆)的一个。
  3. 如果该元素的值比子节点的值更小(对于最小堆)或更大(对于最大堆),则交换它们。
  4. 重复步骤2和步骤3,直到满足堆的性质为止。
应用场景:
  • 上滤: 通常在插入新元素时使用,确保新元素的插入不破坏堆的性质。
  • 下滤: 通常在删除堆顶元素后使用,以恢复堆的性质。
堆化(Heapify)

堆化(Heapify)是指将一个无序的序列转换成一个堆,可以是最小堆或最大堆。堆化过程可以分为两种:自底向上堆化(Bottom-Up Heapify)和自顶向下堆化(Top-Down Heapify)。

自底向上堆化(Bottom-Up Heapify):

自底向上堆化是从序列的最后一个非叶子节点开始,逐步向前处理每个节点,使得以该节点为根的子树成为一个堆。该方法保证了子树堆化后,整个序列也是一个堆。

步骤:

  1. 从序列的最后一个非叶子节点开始(通常是 n/2-1,其中 n 是序列的长度)。

  2. 对每个非叶子节点,与其子节点比较,如果不满足堆的性质,则进行交换。

  3. 重复上述步骤,直到处理完整个序列。

自顶向下堆化(Top-Down Heapify):

自顶向下堆化是从序列的第一个元素开始,逐步向后处理每个节点,使得以该节点为根的子树成为一个堆。该方法保证了每个节点都满足堆的性质。

步骤:

  1. 从序列的第一个元素开始。

  2. 对每个节点,与其子节点比较,如果不满足堆的性质,则进行交换。

  3. 重复上述步骤,直到处理完整个序列。

应用场景:

  • 建堆: 堆化是建立堆的关键步骤,可以在 O(n) 的时间复杂度内将一个无序序列转化为堆。
  • 堆排序: 在堆排序算法中,首先对待排序序列进行堆化,然后反复取出堆顶元素,直到堆为空,实现排序。
  • 优先队列: 堆被广泛应用于实现优先队列,堆化操作确保队列中优先级最高的元素位于队首。

推荐观看: 【从堆的定义到优先队列、堆排序】 10分钟看懂必考的数据结构——堆

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

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

相关文章

H266/VVC帧间预测编码技术概述

帧间预测编码简述 帧间预测利用视频时间域的相关性,使用邻近已编码图像像素值预测当前图像的像素值,能有效去除视频时域冗余。 目前主要的视频编码标准中,帧间预测都采用基于块的运动补偿技术,不同的编码标准有不同的分块方式。 …

爆款前端设计工具揭晓!提高工作效率的5款神器,助你事半功倍!

前端设计工具以更低的成本提供更快的移动开发,他们帮助前端开发人员有效地创建响应设计,但找到一个实用的前端设计工具并不容易,在这里,即时设计师为您组织了五个免费和易于使用的前端页面工具,来选择一个!…

使用Visual Studio调试VisionPro脚本

使用Visual Studio调试VisionPro脚本 方法一 : 修改项目文件 csproj步骤: 方法二 : Visual Studio附加功能步骤: 方法一 : 修改项目文件 csproj 步骤: 开启VisionPro脚本调试功能 创建一个VisionPro程序…

如何快速删除pdf周围的空白

问题:写论文往往需要pdf格式的图片,但pdf往往四周存在大量空白需要手动截图很麻烦 解决: 打开命令行输入:pdfcrop 图片名.pdf

理解io/nio/netty

一、io io即input/output,输入和输出 1.1 分类 输入流、输出流(按数据流向) 字节流(InputStream/OutputStream(细分File/Buffered))、字符流(Reader/Writer(细分File/Buffered/pu…

智能优化算法应用:基于卷积优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于卷积优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于卷积优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.卷积优化算法4.实验参数设定5.算法结果6.…

Duboo-入门到学废【上篇】

目录 1🥞.什么是duboo 2🌭.架构图 3.🍿快速入门 4.🧇浅浅理解 1.什么是duboo🤶🤶🤶 Dubbo是一个由阿里巴巴开发的基于Java的开源RPC框架。它提供了高性能、透明化的远程方法调用&#xff0…

操作系统 面试第一弹

1. 进程和线程的区别 进程(Process)和线程(Thread)是操作系统中的重要概念,它们表示执行中的程序的不同执行单元。下面是它们的区别: 定义:进程是一个独立的执行环境,具有独立的内存…

【深度学习】DataComp论文,数据集介绍,大数据模型的数据集介绍

参考: https://laion.ai/blog/datacomp/ 论文:https://arxiv.org/abs/2304.14108 文章目录 论文报告的一些内容datacomp-1B 数据质量比lainon2B要好不同规模数据有多少数据数据处理数据来源 论文报告的一些内容 摘要 多模态数据集是近期如CLIP、Stable …

TCP服务器的演变过程:IO多路复用机制select实现TCP服务器

IO多路复用机制select实现TCP服务器 一、前言二、新增使用API函数2.1、select()函数2.2、FD_*系列函数 三、实现步骤四、完整代码五、TCP客户端5.1、自己实现一个TCP客户端5.2、Windows下可以使用NetAssist的网络助手工具 小结 一、前言 手把手教你从0开始编写TCP服务器程序&a…

洛谷——【数据结构1-2】二叉树

文章目录 题目【深基16.例1】淘汰赛题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1基本思路:代码 【深基16.例3】二叉树深度题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1基本思路:代码 [USACO3.4] 美国血统 American Heritage题目描…

算符优先语法分析设计原理与实现

前言: 作者的词法分析程序以及算符优先语法分析设计程序仓库链接 1、目标任务 **[实验项目] **以专题 1 词法分析程序的输出为语法分析的输入,实现算符优先分析算法,完成以下描述算术表达式的算符优先文法的算符优先分析过程。 G[E]:E→E…

Spark编程实验三:Spark SQL编程

目录 一、目的与要求 二、实验内容 三、实验步骤 1、Spark SQL基本操作 2、编程实现将RDD转换为DataFrame 3、编程实现利用DataFrame读写MySQL的数据 四、结果分析与实验体会 一、目的与要求 1、通过实验掌握Spark SQL的基本编程方法; 2、熟悉RDD到DataFram…

2024免费的数据恢复软件EasyRecovery14自己操作就能恢复的方法

而今天小编为大家还是带来了同系列软件easyrecovery14,这是easyrecovery数据恢复软件中的技术员版本,不仅包含家庭版和专业版的所有功能,而且还旨在简化技术人员的数据恢复过程。软件拥有强大的数据恢复功能,支持使用的恢复场景有…

KNN与KD树博客总结

目录 总结小结: 总结 原始篇:KNN算法及其优缺点算法思想改进篇:KD树(KNN的plus版算法实现第一篇:平衡二叉树的构建(递归算法实现第二篇:KD树的构建(递归算法实现第三篇:…

CentOS 7 设置网络

CentOS 7 设置网络 正常情况 ①登陆进去之后使用下面的命令修改文件 echo ONBOOTyes >> /etc/sysconfig/network-scripts/ifcfg-ens33②如果是虚拟机重启后使用如下命令进行查看IP地址 ip addr注:到这里如果显示有两部分,则代表网络设置成功&a…

华为设备VRP系统管理

为了满足企业业务对网络的需求,网络设备中的系统文件需要不断进行升级。另外,网络设备中的配置文件也需要时常进行备份,以防设备故障或其他灾害给业务带来损害。在升级和备份系统文件或配置文件时,经常会使用FTP和TFTP来传输文件。…

服务器系统时间不同步如何处理

在分布式计算环境中,服务器系统时间的同步至关重要。然而,由于各种原因,服务器系统时间不同步的问题时有发生,这可能会导致严重的问题,如日志不准确、证书验证失败等。下面我们可以一起探讨下造成服务器系统时间不同的原因以及解决…

【Vue2+3入门到实战】(5)Vue基础之Computed计算属性 详细示例

目录 一、今日学习目标1.computed计算属性 二、computed计算属性1.概念2.语法3.注意4.案例5.代码准备 三、computed计算属性 VS methods方法1.computed计算属性2.methods计算属性3.计算属性的优势4.总结 四、计算属性的完整写法五、综合案例-成绩案例六、Computed计算属性总结 …

揭秘Pod状态与生命周期管理的秘密(中)

上一篇文章中主要介绍了Pod的基础概念与使用、删除。本文将带你一起学习Pod的几种容器(Init、Pause) 点击 这里 可以查看所有相关文章。 Init 容器 本文讲解 Init 容器的基本概念,这是一种专用的容器,在应用程序容器启动之前运行,用来包含…