堆中的 siftUp 和 siftDown 操作用于堆化数组

2024-04-16

假设 MAX-HEAPIFY 操作。其中父元素值大于其子元素值。

  • siftDown 将太小的节点与其最大的子节点交换(从而将其向下移动),直到它至少与两个节点一样大 在它下面。

  • siftUp 将太大的节点与其父节点交换(从而移动 )直到它不大于它上面的节点。构建堆 函数获取未排序项目的数组并移动它们,直到它们 都满足堆性质。


buildHeap 可以采用两种方法。一是开始 在堆的顶部(数组的开头)并调用 siftUp 每一个项目。在每一步中,之前筛选的项目(之前的项目) 数组中的当前项)形成一个有效的堆,并筛选下一个 item up 将其放入堆中的有效位置。筛选后 每个节点,所有项都满足堆属性。第二种方法 向相反方向移动:从数组末尾开始并移动 向后朝向前方。在每次迭代中,您都会筛选一个项目 直到它位于正确的位置。

令数组 a 有 5 个元素 a[4,2,3,5,6] 。

siftUp-

输入-a[4,2,3,5,6]

加工-

从数组的开头应用 siftUp 操作。

筛选(4)-
没有交换,因为它是根

 heapified Array-a[4]

向上筛选(2)-

没有交换,因为父值 (4) 更多

heapified Array-a[4,2]

筛选(3)-

没有交换,因为父值 (4) 更多

heapified Array-a[4,2,3]

筛选(5)-

它的父值为 2,因此交换 (5,2)。

          Array-a[4,5,3,2]

现在 5 的父值是 4,所以再次交换 (5,4)。

 heapified Array-a[5,4,3,2]

筛选(6)-

首先在 (6,4) 之间交换,然后在 (6,5) 之间交换

 heapified Array-a[6,5,3,2,4]

输出-a[6,5,3,2,4]

筛选-

输入-a[4,2,3,5,6]

加工-

从数组末尾开始,我们将一一应用 siftDown 操作。

筛选(6)-

它没有孩子,所以没有交换。这同样适用于 siftDown(5) 和 siftDown(3) ,因为它们没有任何子级。所以它们不能进一步向下移动。

到目前为止的数组 - a[4,2,3,5,6]

筛选(2)-

它会与较大的子值进行交换。这里 6 是较大的一个。所以交换(2,6)。

数组将如何 -a[4,6,3,5,2]

筛选(4)-

4 有两个孩子 6 和 3。与较大的孩子交换。交换(4,6)完成。 现在数组将是 - a[6,4,3,5,2]

同样, 4 必须被交换,因为它有一个比它自身大的孩子,即 5 。这样交换(4,5)就完成了。

数组将是 - a[6,5,3,4,2]

堆化数组 -a[6,5,3,4,2]

输出-a[6,5,3,4,2]

为什么在对同一组元素执行 siftUp 和 siftDown 操作时会得到两个不同的输出?或者,当 siftUp 和 siftDown 应用于同一组元素时,可能会有不同的堆。请澄清。 :)


是的,同一组元素可以有不同的堆。

两种方法都能正确生成满足堆属性的堆:父元素值大于子元素值.

第一种方法:

    6
   / \
  5   3
 / \
2   4

第二种方法:

    6
   / \
  5   3
 / \
4   2

事实上,如果你手工绘制它,还有其他可能的堆,例如

    6
   / \
  4   5
 / \
2   3

但请注意,这两种方法虽然都能生成正确的结果,但它们具有不同的复杂性。看构建堆的时间复杂度怎么可能是O(n)? https://stackoverflow.com/questions/9755721/how-can-building-a-heap-be-on-time-complexity.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

堆中的 siftUp 和 siftDown 操作用于堆化数组 的相关文章

  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 如何从 Javascript/Typescript 中的数组对象计算运行总计并使用 HTML 在每个实例上显示输出?

    我正在开发一个 MEAN 堆栈项目 并且有一个如下所示的数组 savings any 300 450 350 500 我还有一个名为 saving bf 的变量 它是从数据库中检索的结转储蓄 其值如下 savings bf 15000 我想
  • foreach 循环中 current() 的意外行为[重复]

    这个问题在这里已经有答案了 这是一个简单的循环 list array A B C D foreach list as var print current list Output demo http 3v4l org sBDjl BBBB O
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 关于在字典中查找所有有效单词的算法问题

    给定一个字典 只是一个字符串列表 您收到来自外部来源的未知数量的信件 给定字母串 您将如何列出您可以通过这些字母的任意组合组成的所有有效单词 来自字典 因此 如果您收到 applead 你应该找到apple bad pad lead等 我知
  • 自动过滤/排序列表框项目 (Windows Phone)

    我想确保添加到列表框中的项目根据每个项目的序列号按升序排序 例如 1 项目 2 项目 4 项目 3 项目应根据其编号自动排序 1 2 3 10 这是 C 源代码 namespace XeroQuiz public partial class
  • 包围一组点的多边形

    我有一组 S 点 2D 由 x 和 y 定义 我想找到 P 包围该组所有点的最小 含义 具有最少数量的点 多边形 P 是S 有没有已知的算法来计算这个 我在这个领域缺乏文化令人惊讶 感谢您的帮助 对于这个问题有很多算法 它被称为 最小边界框
  • 7 张牌扑克手牌评估器

    有谁知道评估 7 张牌扑克牌的快速算法吗 这比简单地暴力检查 7 张牌中每 21 个 5 张牌的组合更有效 Cheers Pete 我写了一篇JavaScript 核心评估方法仅使用位操作 因此速度非常快 考虑到这一点 查看 21 种组合还
  • 对 os.listdir 文件进行排序 Python

    如果已下载数年的数据 这些数据存储在具有以下命名约定的文件中 year day dat 例如 名为 2014 1 dat 的文件包含 2014 年 1 月 1 日的数据 我需要按天排序读取这些数据文件 2014 1 dat 2014 2 d
  • 生成所有多集大小为 n 的分区的算法

    我一直在试图找出一种方法来生成多重集的所有不同的大小为 n 的分区 但到目前为止却空手而归 首先让我展示一下我想要实现的目标 假设我们有一个输入向量uint32 t std vector
  • 用 C++ 生成 AST

    我正在用 C 制作一个解释器 到目前为止我已经有了词法分析器来生成标记 问题是我不确定如何生成 行走 解析树 我正在考虑使用数组数组来制作解析树 但我不确定如何以正确的顺序将标记实际插入到解析树中 我不确定是自上而下 左右还是自下而上 左右
  • NumPy 和 SciPy - .todense() 和 .toarray() 之间的区别

    我想知道使用是否有什么区别 优点 缺点 toarray vs todense 在稀疏 NumPy 数组上 例如 import scipy as sp import numpy as np sparse m sp sparse bsr mat
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 在多个数组中搜索字符串,然后设置 var - jQuery

    我正在寻找基于字符串存在于哪个数组中设置一个变量 例如 var primary red blue yellow var secondary orange purple green 然后检查 purple 并返回它在 secondary 数组
  • 数学组合的完美最小哈希

    首先定义两个整数N and K where N gt K 两者都在编译时已知 例如 N 8 and K 3 接下来 定义一组整数 0 N or 1 N 如果这使答案更简单 并调用它S 例如 0 1 2 3 4 5 6 7 的子集数量S wi
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 如何从一维数组和静态字符串创建对象

    我想要一个像 var obj ABC name true dob true CDE name true dob true EFG name true dob true CBA name true dob true XYZ name true
  • python array(10,1) 和 array(10,) 之间的区别

    我正在尝试将 MNIST 数据集加载到数组中 当我使用 X train y train X test y test mnist load data 我得到一个数组 y test 10000 但我希望它的形状为 10000 1 数组 1000

随机推荐

  • 为什么我在部署容器时看到此错误:“错误:(gcloud.run.deploy) PERMISSION_DENIED:调用者没有权限”?

    假设我有一个cloudbuild yaml文件如下所示 还假设我可以在使用时手动运行和部署有问题的容器gcloud用于单独的功能 构建和运行 部署的时候第三步就出现错误ERROR gcloud run deploy PERMISSION D
  • Gmail 如何识别电子邮件签名(或者“识别电子邮件签名的最佳方式是什么?”)

    Gmail 会自动将看起来像签名的文本变成灰色 有人猜测它是如何做到这一点的吗 我注意到这取决于发件人姓名的存在 但我认为这只是故事的一部分 我之所以这么问 是因为我正在开发一个具有电子邮件界面的 Web 应用程序 并且我想在显示用户的电子
  • Python Pandas - 如何通过描述函数计算 25 个百分点

    对于数据框中的给定数据集 当我应用describe函数 我得到基本统计数据 包括最小值 最大值 25 50 等 例如 data 1 pd DataFrame One 4 6 8 10 columns One data 1 describe
  • 登录 Scala

    在 Java 中 日志记录的标准习惯用法是为记录器对象创建一个静态变量 并在各种方法中使用它 在 Scala 中 习惯用法似乎是使用 logger 成员创建 Logging 特征 并将该特征混合到具体类中 这意味着每次创建对象时 它都会调用
  • 如何根据方向改变屏幕布局?

    在肖像中我有 5 个图标 第一行有 4 个图标 第二行有 1 个图标 但在横向中 第五个图标必须适合第一行 怎么解决这个问题 对于纵向和横向位置使用不同的布局文件 使用layout land用于风景位置 当方向改变时 Android 会自动
  • 优化 MySQL 插入以处理数据流

    我正在使用高速数据流并执行以下步骤将数据存储在 MySQL 数据库中 对于每件新到货的商品 1 解析传入项 2 执行几次 INSERT ON DUPLICATE KEY UPDATE 我用过插入 重复密钥更新 http dev mysql
  • 查找给定范围内给定数字的整数个数的算法

    如果我以列表的形式得到完整的数字集list我想知道它们在给定范围内可以形成多少个 有效 整数 A B 我可以使用什么算法来有效地完成它 例如 给定一个数字列表 包含重复项和零 list 5 3 3 2 0 0 我想知道这个范围内可以组成多少
  • 为什么字体名称需要引号?

    据我所知 如果字体包含空格 则需要使用双引号或单引号 例如 font family Times New Roman Times font family Times New Roman Times 但在谷歌字体上 http www googl
  • Git:区分本地和远程标签

    如果远程存储库中有标签 我通常会在拉取时自动获取它们 当我删除创建的本地标签时 git tag d
  • Hudson 基于 URL 令牌构建

    我配置了一个 hudson 实例并创建了作业 创建构建时 我能够看到此选项 通过访问此 URL SecretTOKEN 触发构建 选项 现在 我无法在我创造的任何新工作中看到这一点 我是否缺少某些设置或配置 我所做的唯一更改是将 servl
  • C# 中的委托数组

    我正在尝试从委托数组调用委托函数 我已经能够创建委托数组 但是如何调用委托呢 public delegate void pd public static class MyClass static void p1 static void p2
  • Spring 提供静态内容,同时具有通配符控制器路由

    我的应用程序是在前端使用骨干和后端使用 spring 框架构建的 这是一个单一的 html 应用程序 路由由骨干网处理 因此我有一个具有以下结构的后端路由 RequestMapping value method RequestMethod
  • 如何调用maven默认生命周期

    如果我打电话 mvn clean install maven知道clean是一个生命周期 install是默认生命周期的一个阶段 如果我打电话 mvn deploy maven 将按顺序执行默认生命周期的所有阶段 有没有办法通过给出生命周期
  • Mac OS X:尝试链接(ld)到框架

    我正在阅读 Mark 和 Aaron 所著的 高级 Mac OS X 编程 我无法让一个终端语句正常工作 cc g o useadd F Adder build framework 加法器 useadd m 它位于第 45 页 第 3 章
  • Angular2 - 多个依赖的顺序 http api 调用

    我正在构建一个 Angular2 应用程序 其中一个组件需要进行多个 API 调用 这些调用依赖于之前的调用 我目前有一项服务可以调用 API 来获取电视节目列表 对于每个节目 我需要多次调用不同的 API 来逐步检查该结构 以确定该节目是
  • 在rocker/shiny docker中部署shiny应用程序

    嗯 我是新来的Docker我需要在 Docker 容器中实现一个闪亮的应用程序 我有来自的图像https hub docker com r rocker shiny https hub docker com r rocker shiny 包
  • 操作链接到同一页面

    我需要创建一个 html 操作链接 相当于 a href Test Link a 或当前页面的操作链接 有人有例子吗 你可以尝试用这个 a href Url Action null Test Link a 帮手Url Action第一个参数
  • SQL 查询 C# 的 In 子句中的多个 ID [已关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我基本上想在 sql 查询的 In 子句中使用多个 iD 现在我有两个选择 一个是从文本框中获取逗号分隔的 ID 或者我可以放置一个列表视图
  • MySQL临时表是共享资源吗?

    我有一个使用临时表的 MySQL 存储过程 假设我的表名称是 temp 我用它来存储一些中间数据 它将在程序开始时创建 并在程序结束时删除 CREATE PROCEDURE p BEGIN CREATE TEMPORARY TABLE te
  • 堆中的 siftUp 和 siftDown 操作用于堆化数组

    假设 MAX HEAPIFY 操作 其中父元素值大于其子元素值 siftDown 将太小的节点与其最大的子节点交换 从而将其向下移动 直到它至少与两个节点一样大 在它下面 siftUp 将太大的节点与其父节点交换 从而移动 直到它不大于它上