当前位置: 首页 > 知识库问答 >
问题:

试图理解最大堆化

童冠玉
2023-03-14

我试着看http://ocw.mit.edu/courses/electrice-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/lecture-videos/lecture-4-heaps-and-heap-sort/来理解堆和堆排序,但没有发现这一点。

我不明白max-heapify的功能。它看起来像是一个递归函数,但由于树的高度,它会以对数时间运行。

对我来说这毫无意义。在最坏的情况下,它不是要逆转每一个单个节点吗?我看不出如何做到这一点,不让它反复地触及每一个节点。

共有1个答案

何升
2023-03-14

以下是MAX-HEAPIFY的功能:

给定索引i处的一个节点,其左、右子树都是max-heaps,MAX-HEAPIFY将i处的节点向下移动max-heap直到它不再违反max-heap属性(即节点不小于它的子节点)。

一个节点在其处于适当位置之前所能走的最长路径等于该节点的起始高度。每当节点需要在树中再往下走一层时,算法就会恰好选择一个分支采取,并且绝不会回溯。如果被堆化的节点是max-heap的根,那么它可以采取的最长路径是树的高度,或者o(logn)

for i = floor(length(A)/2) downto 1
   do MAX-HEAPIFY(A,i)

由于调用MAX-HEAPIFYO(n)次,因此构建整个堆的时间为O(n log n).*

*如注释中所述,可以显示O(n)的一个更紧的上界。有关分析,请参见CLRS第2版和第3版的第6.3节。(我的第1版已经打包好了,所以我无法验证节号。)

 类似资料:
  • 我在[17,98,89,42,67,54,89,25,38]中有一个数字列表,从左到右插入到一个空堆中。生成的堆是什么?

  • 问题内容: 我有一台服务器,可能导致以下输出死亡: 但是,如果没有堆栈转储或跟踪,就无法确定这是无限递归还是只是链太大而已,更不用说问题函数在哪里了。 使用该选项运行Node 不仅使我的测试运行缓慢(正如人们期望的那样),而且没有重现该问题。 有人有任何解决方案或提示来深入了解此问题吗? 问题答案: 看来目前的答案是:站稳脚步,等待Node.js更新到新的V8版本,或者使用此Chromium项目错

  • 我是一个初学者Java学习者,我一直在努力跟随欧拉项目。 我找到了Nayuki对这些问题的解决方案,我很难理解这里接口的需求/用途。英语不是我的第一语言,所以我有点困惑,这里的界面评论到底是什么意思: 据我所知,这意味着我可以运行接口,同时运行所有类,而不是逐个运行每个问题类?所以我不一定需要这个接口来解决问题,它只是一种实用的方法来检查它们是否都按预期的方式工作。 我知道编程是非常抽象的,但是我

  • 我正在使用Java测量线束(JMH)对一些例程进行基准测试。我对获取每次运行的最大堆大小感兴趣。JMH的GC Profiler为我提供了诸如分配率和流失率之类的信息,但我正在寻找在测试运行期间堆获得的最大值。这能做到吗?

  • 问题内容: 我已经读到 32位Windows上的最大堆大小是〜1.5GB,这是由于JVM需要连续的内存。有人可以解释“连续内存”的概念吗,为什么Windows上最多只有1.5GB? 其次,那么64位Windows上的最大堆大小是什么?为什么与32位Windows上可用的最大堆大小不同? 问题答案: 32位/ 64位部分与Java无关 事实证明,32位系统中的内存位置由32位无符号整数引用。这最多允

  • 我刚刚在VServer和JRE Build1.7.0_67-B01上安装了Ubuntu 64bit。如果我想运行一个java jar文件,它说 无效的最大堆大小:-XMX错误:无法创建Java虚拟机。错误:发生致命异常。程序将退出。 我试了1M,256M,1024M,2G和4G的-XMX,都不起作用。是不是有我不知道的隐藏设定? 下面是我使用的命令: