问题标签 [max-heap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 将项目插入最大堆
我不知道如何将一个项目插入我的最大堆然后涓涓细流以保持最大堆属性。如果 heapArray 已满因此无法插入项目,我会抛出异常。
我没有为此程序使用 JCF 类或优先级队列。我还抛出了我的 deleteMax 方法,该方法删除了堆的最大值并恢复了堆,因此最大堆属性保持不变。
这是我的 removeMax 方法。
任何帮助将不胜感激。谢谢!
algorithm - 我们需要从哪里开始 max-heapify 算法?
我不需要,我们有办法应用 max-heapify 算法吗?我们必须从下到上还是从上到下应用它?或者我们可以应用到没有堆属性的地方吗?当我们要在树中维护堆属性时。
任何身体都可以帮忙吗?
heap - 堆排序,了解基础
作为免责声明,我是该网站的新手,因此不太了解如何提问。请不要太苛刻,因为我真的只是想了解其中一些概念是如何工作的。如果我在开始时缺少理解,请告诉我,这样我就可以从那里开始,而不会浪费你的时间。这里什么都没有。因为我认为我的理解可能存在缺陷,所以我提出了一些关于堆如何在不同领域发挥作用的问题,然后尝试回答这些问题。
首先,我想帮助了解添加到空堆中的一组随机数字的外观。例如,我有 9、4、5、3、2、7、8、7。将其添加到堆后,堆会是什么样子?我可以直观地理解这一点(我认为)9 是根,4 是第一个左孩子等等,但由于这不是专门的树,而是一个堆,它会通过切换对数字进行排序吗它们(见“如果我的理解是正确的”段落),以便它们按最小或最大顺序排序?
现在假设我们从堆中删除了 9(我相信 9 将是根),我们将如何应对这种变化,然后将什么放入根中?我认为如果 9 是根节点,我们将取下一个最大的数字并将其复制到 9 的插槽中,而如果这是一个最小堆并且我们只是在底部删除一个节点,它只会被删除 no问题。
沿着类似的思路,获取数组中堆项的父项的公式是什么?--我想我明白这一点,如果父母在i,左孩子将在i * 2,右孩子将在i * 2 + 1。因此要找到父代,我们必须除以 i/2 才能找到父代。例如,如果我们在 i=7 处,父级将是 i=3,因为 3.5 将被截断,如果我们在 i=6 处,父级也将是 i=3。在这个例子中,i = 7 处的孩子将是 i = 3 的右孩子,而 i=6 将是 i = 3 的左孩子。
如果我对此的理解是正确的,那么在将新术语添加到根后进行重新整理,我会将孩子与父母进行比较,如果孩子更大,请切换术语。但是我需要比较两个孩子(如果有两个),看看哪个更大,然后决定哪个孩子需要交换。这将是一个最大堆,而另一个方向是最小堆。
最后,如果我在哪里添加根元素,它将如何重新堆积?
javascript - 堆排序在 Javascript 中不起作用
我正在尝试在 Javascript 中实现堆排序,但是有一个undefined
元素,array.length - 2
并且索引 0 处的元素是未排序的。这是代码:
我想,array[i] == undefined
当i = array.length
. 我尝试修复此(设置i = array.length - 1
),但数组以完全不同的顺序出现。我还发现 0 从未交换过,因为 i 总是大于 0。我再次尝试,数组以完全不同的顺序出现。
java - 我的堆排序不工作。我找不到错误
我正在尝试学习堆排序。我遵循伪代码指令,但是,我的程序无法正常工作。我现在已经调试了一个小时,找不到错误。有几个错误:首先,arraylist 没有正确排序;其次,arraylist 似乎是从 max -> min 排序的,即使假设它是从 min -> max 排序的。对不起初学者的问题。
python - 使用最大堆数据结构的优先级队列
我正在使用 Python 中的最大堆数据结构实现优先级队列。我使用了几个名称,它们的优先级是与其关联的数字(9 是最高的,1 是最低的)。我面临的问题是,当我从优先级队列中出列一个项目时,它不会使具有最高优先级的项目出列。我认为这意味着我的队列存在问题,并且它没有根据项目的优先级将项目插入堆中的正确位置。如果有人能帮我解决这个问题,将不胜感激。
我的优先队列代码:
运行代码并调用 main 后的输出:
最大堆代码(教科书提供):
algorithm - GoLang 堆和堆排序
所以我正在尝试实现一个最大堆来练习,这样我就可以熟悉 Go。
[4,1,3,2,16,9,10,14,8,7]
在我生产的数组上[16 14 9 10 8 1 4 2 3 7]
这是错误的,因为 9 太高了一级,应该与 10 切换。
我哪里错了?
我也知道有些事情很奇怪,因为当我尝试堆排序时
这没用。
java - 从最大堆中的任何位置删除元素
我有一个只有 x 和 y 的 Point 对象,我有一个 Heap 数据结构,如下所示:
我正在尝试实现一种从堆中删除任何点的方法,而不是传统的删除它只是删除顶部的方法。我不完全确定如何去做。我在想我可以将 Point 的索引存储在 Point 内部的堆中。我不确定这是否有帮助。
max-heap - 合并 2 个最大堆
我需要找到最有效的算法来合并 2 个最大堆。
一些重要的事实:堆表示为二叉树,这意味着每个节点都有 3 个字段 - 值(键)、指向右孩子的指针和指向左孩子的指针。
我的想法:取第二个堆的最后一片叶子,并将他作为新堆的根。所以我们得到一个新的堆,当左孩子是一个合法的最大堆,而右孩子是一个合法的最大堆。问题(在我看来)只是根不是最大元素的事实 - 所以我们可以从根运行函数Max-Heapify,我认为它应该可以解决问题。
最坏情况下的总运行时间 - O(logn) - 因为将叶子作为根是O(1),而Max-Heapify是O(logn)。
你怎么看待这件事?我对么?是否有更有效的算法来合并 2 个最大堆?(请考虑表示是二叉树的事实)
java - 使用递归将数组标识为 MaxHeap
在优先队列的这个实现中,我必须使用递归来确定我作为方法参数接收的数组IsMaxHeap
是否是最大堆。
我想确保我评估所有可能使这项工作正常工作或不工作没有任何问题的案例。
你可以帮帮我吗?