7

过去一周我一直在研究 dijkstra 的算法,我在 java 中有正确的运行代码。它使用数组来计算标准 findMin 函数,该函数为您提供距离最小的顶点。显然它是 O(n),现在我希望使用 Priority Queue(Min Heaps) 来实现它

我的思考过程是:

while (there are unseen Vertex)
{

    vertex= get TheVertex WithSmallest Distance Yet;//(In can be done in O(log n) using heap)

  for this vertex {

    find all of the adjacent edges and traverse them.

    for a particular vertex which is not there in heap yet{

        Simply add it in the queue;
    }
  }
}

但是如果堆中存在一个特定的顶点,那么考虑到找到的 Min 节点的距离,它的距离可能会被更新。

现在我的问题是如何在 O(log n) 时间内更新堆中的特定元素。

我们不能在 O(1) 时间内找到那个元素,对吧?

在像我这样的幼稚实现中,它将是 O(n),

那么任何人都可以建议可以做些什么来处理这个瓶颈吗?我们如何在 O(log n) 时间内更新堆中的特定顶点?(类似地,我们如何在 O(1) 时间内找到特定元素)

4

1 回答 1

7

我知道这种情况有两种基本方法:

  1. 每当您访问顶点的邻居时,无论它们是否在堆中,都将它们插入堆中。然后,当你得到距离堆最小的顶点时,检查它之前是否已经从堆中删除。如果有,那么也删除这个并继续。否则,将其标记为已删除并访问所有邻居。

  2. 保留一个显式指针,指向每个元素在堆中的位置。然后,您可以对已定位的元素执行称为“减少键”的操作。

于 2012-08-03T19:56:03.513 回答