Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果数据在两次删除之间发生更改,则Minheap和删除项_Java_Dijkstra_Min Heap - Fatal编程技术网

Java 如果数据在两次删除之间发生更改,则Minheap和删除项

Java 如果数据在两次删除之间发生更改,则Minheap和删除项,java,dijkstra,min-heap,Java,Dijkstra,Min Heap,我昨天问了一个问题,但不是很清楚,所以这是一个更具体的问题 我将我的minheap表示为一个数组。我想我对minheaps有很好的理解,但我对其中的某个概念不太清楚。Minheaps总是以最小的节点作为根。要删除值,将根设置为数组表示形式中的最后一个元素(叶节点),并减小数组的大小。然后,通过使用siftDown/PercolateDown或任何您想称之为它的东西来正确放置根节点。这是超高效的。例如: 此处29取自最后一个元素,siftDown(1)将放置它: 29与15和38相比。交换29和

我昨天问了一个问题,但不是很清楚,所以这是一个更具体的问题

我将我的minheap表示为一个数组。我想我对minheaps有很好的理解,但我对其中的某个概念不太清楚。Minheaps总是以最小的节点作为根。要删除值,将根设置为数组表示形式中的最后一个元素(叶节点),并减小数组的大小。然后,通过使用siftDown/PercolateDown或任何您想称之为它的东西来正确放置根节点。这是超高效的。例如:

此处29取自最后一个元素,siftDown(1)将放置它:

  • 29与15和38相比。交换29和15
  • 29与25和20相比。交换29和20
  • 29与30比较,29<30,因此我们完成了
  • 这一切都很好,但如果在两个删除min的实例之间,其他一些数据发生了变化,该怎么办?例如:

    那么,在这里:

  • 29与15和38相比。交换29和15
  • 29与30和32相比。29<30和29<32因此,我们完成了
  • 1是树中的最小值,但尚未将其设置为最小值,已设置为15。这对我来说是个大问题。我试图实现Dijkstras算法,我还试图使用我自己的数据结构,而不涉及java内置类

    因此,对于我的问题,一个更相关的例子是:

    对于熟悉Dijkstras的人来说,99表示无限的暂定距离,其他数字表示接下来应该访问的图节点(距离最小的节点,在本例中为3)

    一个解决方案是在每次删除min时重新构建树,但是这意味着minheap的功能将丢失,任何实现都会减慢到爬行的速度


    如果我没有正确理解这一点,我深表歉意,但我已经坚持了好几天,我真的需要一些帮助。

    您需要了解算法的先决条件。该算法不适用于任何任意数组。仅当其左子级和右子级为堆时,它才起作用

    在第二个示例中,根的左子级不是最小堆。因此,该算法不会产生最小堆


    如果最终的数组违反了heap属性,则实现中一定有错误,如映像编号3。

    第二个示例中的步骤2不正确,当29与30和32进行比较时,不应与它们中的任何一个进行交换,因为它是less@AdamSkywalker好样的!修复了,谢谢。我目前正在使用peek min()获取最小值,这是一个距离最小的节点,然后我的Dijkstras实现从minheap外部更改节点的优先级。这就是问题的根源。问题是,无论我在哪里看到,都建议使用minheap来执行此操作,但我完全被卡住了,而且时间太长了。@LismUK在Dijkstra中减少节点距离时,不能简单地更改数组中的值。您需要实现一个
    decreaseKey
    算法,该算法可以正确地重新排列堆中的节点,从而不违反heap属性。