深入解析数据结构与算法之堆

news/2024/5/20 7:57:23 标签: 算法,

文章目录

    • 🥦引言:
    • 🥦什么是
    • 🥦大顶与小顶
      • 🧄大顶(Max Heap)
      • 🧄小顶(Min Heap)
    • 🥦的表示
      • 🧄数组表示:
      • 🧄树表示:
    • 🥦的操作
      • 🧄化操作
      • 🧄插入操作
      • 🧄删除根节点操作
      • 🧄的创建
    • 🥦的应用
      • 🧄优先队列
      • 🧄排序
      • 🧄辅助数据结构
    • 🥦的复杂度分析
    • 🥦结论
    • 🥦参考文献

🥦引言:

在计算机科学中,数据结构和算法是构建复杂软件系统的基石。作为一种经典的数据结构,具有广泛的应用和重要的算法基础。本文将深入解析的原理、性质和常见的操作,帮助读者更好地理解和应用

🥦什么是

是一种特殊的数据结构,属于树的一种表现形式。具有以下两个主要特征:

  • 是一个完全二叉树(或近似完全二叉树):中的所有层次都被填满,最后一层从左到右填入节点。

  • 具有序性:对于最小来说,父节点的值始终小于或等于其子节点的值;对于最大来说,父节点的值始终大于或等于其子节点的值。

  • 中,每个节点的值都取决于其子节点的值:对于最小来说,父节点的值不大于任何子节点的值;对于最大来说,父节点的值不小于任何子节点的值。

🥦大顶与小顶

对于来说,可以根据节点的性质分为两种类型:大顶(Max Heap)和小顶(Min Heap)。

🧄大顶(Max Heap)

在大顶中,父节点的值大于或等于其子节点的值。也就是说,大顶的根节点是中的最大值。对于任意节点i,其子节点的值必须小于或等于节点i的值。大顶常用于获取最大值或进行部分排序。
结构表示如下:
在这里插入图片描述

🧄小顶(Min Heap)

在小顶中,父节点的值小于或等于其子节点的值。也就是说,小顶的根节点是中的最小值。对于任意节点i,其子节点的值必须大于或等于节点i的值。小顶常用于获取最小值或进行部分排序。
结构表示如下:
在这里插入图片描述

无论是大顶还是小顶的逻辑结构和操作都是相同的。唯一的区别是节点的值大小和根节点的值。

在实际应用中,大顶和小顶都有各自的用途。例如,在优先队列中,可以使用大顶来实现,以便快速获取优先级最高的元素。而在进行部分排序时,可以使用小顶来实现,以方便获取最小的k个元素。

无论是大顶还是小顶,它们都是一种非常重要的数据结构,在算法和数据处理中有广泛的应用。了解的性质和操作,可以帮助我们更好地理解和应用这两种

🥦的表示

可以使用数组或树来表示。下面分别介绍这两种表示方法:

🧄数组表示:

  • 在数组表示中,的元素按照完全二叉树的形式存储在一个数组中。

  • 的根节点存储在数组的索引位置0处。

  • 对于索引为i的节点,其左子节点的索引为2i + 1,右子节点的索引为2i + 2。

  • 通过数组的索引关系,可以方便地在的插入、删除等操作中定位到对应的节点。

例如,对于一个大顶(Max Heap)的数组表示:heap = [9, 6, 7, 3, 5, 1, 4],可以构建如下的结构:
在这里插入图片描述
数组表示:

在这里插入图片描述

🧄树表示:

  • 在树表示中,可以使用二叉树进行表示。

  • 的根节点是二叉树的根节点。

  • 每个节点最多有两个子节点,并且子节点与父节点之间有特定的大小关系(对于大顶是大于等于,对于小顶是小于等于)。

  • 通过指针或引用,可以方便地在的插入、删除等操作中定位到对应的节点。

  • 例如,对于一个大顶(Max Heap)的树表示:
    在这里插入图片描述

🥦的操作

🧄化操作

首先引入的概念, 当我们向一个已经是的数据结构(如数组或二叉)中插入一个新元素时,需要进行插入操作,并保持的性质。这个过程可以称为"插入"。插入的一般步骤如下:

将新元素插入到的最后一个位置(或数组的末尾)。
向上调整(也称为上浮)新插入的元素,直到它在中找到合适的位置并满足的性质。
具体来说,对于大顶(Max Heap)的情况,插入的过程如下:

将新元素插入到的最后一个位置。
与其父节点进行比较,如果新元素的值大于父节点的值,则交换它们的位置。
重复上述步骤,直到新元素找到了合适的位置并满足的性质。

类似地,对于小顶(Min Heap)的情况,插入的过程如下:

将新元素插入到的最后一个位置。
与其父节点进行比较,如果新元素的值小于父节点的值,则交换它们的位置。
重复上述步骤,直到新元素找到了合适的位置并满足的性质。

通过插入操作,可以在保持的性质下有效地将新元素插入到中,并且时间复杂度为O(log n),其中n表示的大小。插入完成后,将继续保持的性质。

🧄插入操作

中插入一个新节点。通常,插入操作首先将新节点添加到的末尾,然后通过向上调整(上滤)操作来恢复序性。
示例:

  1. 初始状态
    在这里插入图片描述

  2. 插入元素12
    插入12后,需要将其与父节点5进行比较,因为12大于5,所以交换它们的位置。
    在这里插入图片描述

  3. 插入12后,需要将其与父节点5进行比较,因为12大于5,所以交换它们的位置。然后,还需要将12与其父节点8进行比较,因为12大于8,所以交换它们的位置。最后,还需要将12与其父节点10进行比较,因为12大于10,所以交换它们的位置。
    在这里插入图片描述


代码示例

def heapify_up(heap, index):
    parent_index = (index - 1) // 2
    while parent_index >= 0 and heap[index] > heap[parent_index]:
        heap[index], heap[parent_index] = heap[parent_index], heap[index]
        index = parent_index
        parent_index = (index - 1) // 2

def insert_into_heap(heap, new_item):
    heap.append(new_item)
    heapify_up(heap, len(heap) - 1)

# 示例使用:
heap = [10,8,7,5,6,3,4]
print("原始:", heap)

insert_into_heap(heap, 9)
print("插入后的:", heap)

🧄删除根节点操作

中的根节点删除。通常,删除根节点后,将中最后一个节点移到根位置,然后通过向下调整(下滤)操作来恢复序性。
下面是一个示例的大顶删除操作的结构图:

  1. 初始状态:

在这里插入图片描述

  1. 删除顶元素12:

在这里插入图片描述

删除顶元素时,需要将最后一个元素5替换到顶,然后通过向下调整操作,将其移动到合适的位置,并保持大顶的性质。

  1. 向下调整操作:

在这里插入图片描述

在向下调整的过程中,将当前节点与其子节点进行比较,如果子节点的值较大,则将当前节点与较大的子节点交换位置。继续以上比较和交换的步骤,直到当前节点不再有子节点或者当前节点的值大于等于其子节点的值,保持大顶的性质。

  1. 最终结果:

在这里插入图片描述

在删除顶元素的过程中,需要进行多次比较和交换,并通过向下调整操作将新的顶元素移动到正确的位置,同时保持大顶的性质。以上是一个简单的示例,实际操作中可能还需要考虑边界情况和特殊情况的处理。

下面是一个示例的 Python 代码,展示了如何执行的删除操作:

import heapq

# 创建一个
heap = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]

# 将列表转换为
heapq.heapify(heap)

# 删除顶元素
root = heapq.heappop(heap)

print("删除的顶元素:", root)
print("删除后的:", heap)

输出如下:

删除的顶元素: 1
删除后的: [2, 3, 4, 3, 5, 9, 5, 6, 5]

在上述代码中,使用了 heapq 模块提供的函数来执行操作。heapify 函数将普通列表转换为,heappop 函数用于删除顶元素,并返回被删除的元素。最后,打印删除的顶元素和删除后的

🧄的创建

现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整成一个小。向下调整算法有一个前提:左右子树必须是一个,才能调整。
  
int array[] = {27,15,19,18,28,34};
在这里插入图片描述


在这里插入图片描述

🥦的应用

🧄优先队列

使用来实现优先队列,可以快速找到最大或最小的元素,并在一系列数据中动态调整优先级。

🧄排序

排序是一种高效的排序算法,利用的性质进行排序操作。

🧄辅助数据结构

在其他算法和数据结构中的实现中起到辅助作用,如图的最短路径算法中使用的Dijkstra算法

🥦的复杂度分析

的插入和删除操作的时间复杂度均为O(log n),其中n为中元素的数量。化操作的时间复杂度为O(n)。

🥦结论

作为一种重要的数据结构,在计算机科学中广泛应用。通过深入理解的原理、性质和操作,我们能够更好地应用解决实际问题。不仅作为优先队列和排序算法的基础,还在各种算法和系统中发挥着重要的作用。熟练掌握的概念和操作,将极大地提高算法设计和实现的能力。

🥦参考文献

Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to algorithms. MIT press.

🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄🍄


🏫博客主页:魔王-T

🏯系列专栏:结构算法

🥝大鹏一日同风起 扶摇直上九万里

❤️感谢大家点赞👍收藏⭐评论✍️


END


http://www.niftyadmin.cn/n/5202458.html

相关文章

在银行外包如何自我提升

作者:苍何,前大厂高级 Java 工程师,阿里云专家博主,CSDN 2023 年 实力新星,土木转码,现任部门技术 leader,专注于互联网技术分享,职场经验分享。 🔥热门文章推荐&#xf…

2024电脑录屏软件排行第一Camtasia喀秋莎

真的要被录屏软件给搞疯了,本来公司说要给新人做个培训视频,想着把视频录屏一下,然后简单的剪辑一下就可以了。可谁知道录屏软件坑这么多,弄来弄去头都秃了,不过在头秃了几天之后,终于让我发现了一个值得“…

C# Onnx 百度PaddleSeg发布的实时人像抠图PP-MattingV2

目录 效果 模型信息 项目 代码 下载 效果 图片源自网络侵删 模型信息 Inputs ------------------------- name:img tensor:Float[1, 3, 480, 640] --------------------------------------------------------------- Outputs -----------------…

按照指定条件对数据进行分组并对每个分组内的全部数据应用自定义函数进行聚合计算groupby().apply()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 按照指定条件对数据进行分组 并对每个分组内的全部数据 应用自定义函数进行聚合计算 groupby().apply() [太阳]选择题 下列输出正确的是: import pandas as pd data {Name: [A, B,…

【设备树添加节点】

节点结束位置都需要加分号 of_iomap 完成映射 of_property_read_u32_array of_property_read_string of_fine_node_by_path

力扣第463题 岛屿的周长 C++ 深度优先搜索 + 思维判断的边界

题目 463. 岛屿的周长 简单 相关标签 深度优先搜索 广度优先搜索 数组 矩阵 给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] 1 表示陆地, grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连(对角线…

数据结构中树、森林 与 二叉树的转换

1 树转换为 二叉树 将树转换成二叉树的步骤是: 加线。在所有的兄弟结点之间加一条线。去线。对于树中的每个结点,只保留它与第一个孩子结点的连线,删除该结点其他孩子结点之间的连线。调整。以树的根结点为轴心,将整个树顺时针旋…

html手势密码解锁插件(附源码)

文章目录 1.设计来源1.1 界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134534785 html手势密码解锁插件(附源码),仿手机手势密码,拖动九…