【问题标题】:Dijkstra's algorithm on a graph whose edge weights are limited边权重有限的图上的 Dijkstra 算法
【发布时间】:2013-04-29 06:01:37
【问题描述】:

假设我们想在一个边权重是整数的图上运行 Dijkstra 算法 范围{1,2,...,W},其中 W 是一个相对较小的数字。如何在O((|V|+|E|)logW)中找到顶点st的最短路径?

我在 S. Dasgupta、C. Papadimitriou 和 U. Vazirani 的《算法》一书中遇到了这个问题。我可以证明,如果我们像以前一样实现 Dijkstra 算法,那么在每次迭代中,优先级队列中节点的距离范围将在W 之内。但是,由于优先级队列没有将相同权重的元素放入同一个桶中的属性,因此这种观察并不能直接导致问题的解决。

谁能给我一些提示,告诉我如何更进一步,让W 为我工作的有界范围?

谢谢!

【问题讨论】:

  • 嗯,通过计数/基数排序,优先级队列的排序可能会更快。同样更新(删除+插入)元素现在可以更快,因为队列可以是数组数组(或数组的排序映射)
  • 在讲座Courses.MIT 中给出了解决方案(Bounded Integer Edge Weights 问题)。此外,它的时间复杂度是线性的$O(|V| + |E|)$。

标签: algorithm dijkstra


【解决方案1】:

您的优先队列中可以有多少个不同的号码?

解决方案 请注意,在您提取大小为 X 的节点之后(现在您放松了..) 它可以达到的最大尺寸是X+W。 所有其他数字都大于 X(因为您从队列中取出了最小值) 所以队列中只有 O(W) 不同的数字,所以你可以将它用作二进制堆,然后每一步都将花费 O(logW),所有这些将是: (V+E)logW。

【讨论】:

    【解决方案2】:

    我们表示最后一个 popmin 权重是 D,所以任何时候优先队列中的键都在 {D, D+1, \ldots, D+C} 的范围内(因为 D 刚刚更新,我们表示pop vertical as v ,则 v 可能会放宽与其相邻的一些垂直线,记为 v,因为 source 到 v 的距离是 D 并且边缘权重小于 C 所以 source 到 v 的新距离最多为 D+C )

    我们和之前一样使用优先队列,优先队列元素是bucket。根据我们的分析,优先级队列中元素的最大数量是C+1

    现在我们分析一下这个数据结构中的一些操作

    popmin:因为优先级队列的最大元素个数是C+1,所以popmin取O(\log(C+1))

    insert&update:因为优先队列的最大元素个数是C+1,所以insert&update需要O(\log(C+1))

    我们发现 Dijkstra 算法需要更新 |E|轮次,每次更新需要 O(\log(C+1)) ,所以在所有更新故事中 O(|E|*O(\log(C+1)))

    找到最小值 |V|需要轮次,每个 popmin 需要 O(\log(C+1)) ,所以在所有更新故事中 O(|V|*O(\log(C+1)))

    所以这个算法总共需要 O(|E|*O(\log(C+1)))+O(|V|*O(\log(C+1))))=O(\log ( C+1)(|V|+|E|))=O((\log C)(|V|+|E|))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 2011-10-11
      • 1970-01-01
      相关资源
      最近更新 更多