Java 如果数据在两次删除之间发生更改,则Minheap和删除项
我昨天问了一个问题,但不是很清楚,所以这是一个更具体的问题 我将我的minheap表示为一个数组。我想我对minheaps有很好的理解,但我对其中的某个概念不太清楚。Minheaps总是以最小的节点作为根。要删除值,将根设置为数组表示形式中的最后一个元素(叶节点),并减小数组的大小。然后,通过使用siftDown/PercolateDown或任何您想称之为它的东西来正确放置根节点。这是超高效的。例如: 此处29取自最后一个元素,siftDown(1)将放置它:Java 如果数据在两次删除之间发生更改,则Minheap和删除项,java,dijkstra,min-heap,Java,Dijkstra,Min Heap,我昨天问了一个问题,但不是很清楚,所以这是一个更具体的问题 我将我的minheap表示为一个数组。我想我对minheaps有很好的理解,但我对其中的某个概念不太清楚。Minheaps总是以最小的节点作为根。要删除值,将根设置为数组表示形式中的最后一个元素(叶节点),并减小数组的大小。然后,通过使用siftDown/PercolateDown或任何您想称之为它的东西来正确放置根节点。这是超高效的。例如: 此处29取自最后一个元素,siftDown(1)将放置它: 29与15和38相比。交换29和
如果我没有正确理解这一点,我深表歉意,但我已经坚持了好几天,我真的需要一些帮助。您需要了解算法的先决条件。该算法不适用于任何任意数组。仅当其左子级和右子级为堆时,它才起作用 在第二个示例中,根的左子级不是最小堆。因此,该算法不会产生最小堆
如果最终的数组违反了heap属性,则实现中一定有错误,如映像编号3。第二个示例中的步骤2不正确,当29与30和32进行比较时,不应与它们中的任何一个进行交换,因为它是less@AdamSkywalker好样的!修复了,谢谢。我目前正在使用peek min()获取最小值,这是一个距离最小的节点,然后我的Dijkstras实现从minheap外部更改节点的优先级。这就是问题的根源。问题是,无论我在哪里看到,都建议使用minheap来执行此操作,但我完全被卡住了,而且时间太长了。@LismUK在Dijkstra中减少节点距离时,不能简单地更改数组中的值。您需要实现一个
decreaseKey
算法,该算法可以正确地重新排列堆中的节点,从而不违反heap属性。