首页 > 其他分享 >数据结构之<堆>的介绍

数据结构之<堆>的介绍

时间:2023-12-24 20:31:46浏览次数:39  
标签:堆化 步骤 元素 介绍 Heapify 序列 数据结构 节点

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,直到满足堆的性质为止。


应用场景:
  • 上滤: 通常在插入新元素时使用,确保新元素的插入不破坏堆的性质。
  • 下滤: 通常在删除堆顶元素后使用,以恢复堆的性质。


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) 的时间复杂度内将一个无序序列转化为堆。
  • 堆排序: 在堆排序算法中,首先对待排序序列进行堆化,然后反复取出堆顶元素,直到堆为空,实现排序。
  • 优先队列: 堆被广泛应用于实现优先队列,堆化操作确保队列中优先级最高的元素位于队首。

标签:堆化,步骤,元素,介绍,Heapify,序列,数据结构,节点
From: https://blog.51cto.com/xaye/8957013

相关文章

  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、Jdbc/mysql示例1、maven依赖2、实现1)、userbean2)、内部匿名类实现3)、lambda实现4)、普通继承RichSinkFunction实现5)、完整代码3、验证本文介绍了Flink将数据sink到mysql中,其实是通过jdbc来将数据sink到rmdb中,mysql是一个常见的数据库,故......
  • 数据结构习题24/12/24
    这道题目可以考虑,如果前缀是一样的长度,那么只需要两个链表同时向后检索,直到找到一样的元素为止。所以应该先找到两个链表的长度,然后将较长的一个链表的多出来的前缀部分删掉,也就不去看这一部分。因为后缀都是一样的,所以长度的差异只可能来自前缀。解决代码:typedefstructNode{......
  • FreeRTOS中的定时器介绍和使用
    FreeRTOS作为一款流行的嵌入式实时操作系统,提供了强大的任务调度和同步机制。在实时嵌入式系统中,定时器是一项重要的功能,用于执行特定任务、延时操作或周期性执行代码。本文将深入介绍FreeRTOS中的定时器,并提供详细的代码演示,以帮助开发者更好地理解和应用定时器功能。1.定时器的......
  • 自我介绍+软工5问
    软件工程https://edu.cnblogs.com/campus/gdgy/CSGrade21-12作业要求https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13015作业目标学会创建并使用博客;学会使用Markdown语言编写博客;向大家介绍自己;掌握GitHub的基本用法自我介绍大家好,我是......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发
    https://www.cnblogs.com/wuhuacong/tag/WPF/ 在我们的SqlSugar的开发框架中,整合了Winform端、Vue3+ElementPlus的前端、以及基于UniApp+Vue+ThorUI的移动前端几个前端处理,基本上覆盖了我们日常的应用模式了,本篇随笔进一步介绍前端应用的领域,研究集成WPF的应用端,循序渐进介绍基......
  • C++简单实现list链表数据结构(一)
    链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。链表的组成:链表由一系列结点组成结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域C++STL中的链表是一个双向循环链表由于链表的存储方式并不是连续的内存空......
  • 短小精悍(2) - Rust终端检测库is-terminal和atty介绍
    title:短小精悍(2)-Rust终端检测库is-terminal和atty介绍zhihu-url:https://zhuanlan.zhihu.com/p/673841498今天给大家介绍的是Rust中非常常用的两个用于检测终端的库is-terminal和atty。这两个库都是千万级别的下载量,大多数和日志、流、交互相关的库都会依赖它们,而我们在......
  • 云打印介绍,云打印适合什么人群使用呢?
    近来一段时间,云打印的概念非常火热,很多有打印需求的小伙伴也是市场在后台咨询我们该如何使用云打印服务。但其实并不是所有人都适合云打印服务的,那么今天我们就来给大家介绍一下云打印,以及了解一下云打印适合什么人群使用。 云打印介绍,云打印是什么意思?随着互联网技术的发展......
  • RocketMQ的特性介绍和常用的业务场景
    RocketMQ(ApacheRocketMQ)是一个开源的分布式消息中间件系统,最初由阿里巴巴开发并捐赠给Apache软件基金会。它是一个可靠、可扩展、高吞吐量、低延迟的分布式消息系统,适用于大规模分布式系统中的消息通信。以下是RocketMQ的一些主要特性和常用场景:特性介绍:分布式架构:RocketMQ采用了......
  • 16 json web token的基本介绍
    jwt全拼是jsonwebtoken。就是服务端给客户端一个加密的字符串。这个字符串中包含了一些信息,比如用户信息等。浏览器每次访问服务端时候,会携带这个字符串。然后服务的获取这个字符串后,通过解密,就可以获取携带的信息,比如用户信息等。这个加密的字符串,包含3部分内容,就是头部+负载+......