【问题标题】:how to Update a key in Priority Queue in O(log n ) time in dijkstra's algorithm?如何在 dijkstra 算法中以 O(log n) 时间更新优先级队列中的键?
【发布时间】:2012-08-03 19:47:44
【问题描述】:

过去一周我一直在研究 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) 时间内找到特定元素)

【问题讨论】:

    标签: algorithm data-structures priority-queue dijkstra


    【解决方案1】:

    我知道针对这种情况的两种基本方法:

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

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

    【讨论】:

    • 请注意,第一种方法会使总运行时间 O((E + V) * log (E)),因为现在 PQ 中最多可以有 O(E) 个元素。跨度>
    • Log(E) 在大 O 表示法中仍然与 log(V) 相同。除非图是多重图,否则我们有 E
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2022-08-24
    相关资源
    最近更新 更多