【发布时间】:2013-04-29 06:01:37
【问题描述】:
假设我们想在一个边权重是整数的图上运行 Dijkstra 算法
范围{1,2,...,W},其中 W 是一个相对较小的数字。如何在O((|V|+|E|)logW)中找到顶点s到t的最短路径?
我在 S. Dasgupta、C. Papadimitriou 和 U. Vazirani 的《算法》一书中遇到了这个问题。我可以证明,如果我们像以前一样实现 Dijkstra 算法,那么在每次迭代中,优先级队列中节点的距离范围将在W 之内。但是,由于优先级队列没有将相同权重的元素放入同一个桶中的属性,因此这种观察并不能直接导致问题的解决。
谁能给我一些提示,告诉我如何更进一步,让W 为我工作的有界范围?
谢谢!
【问题讨论】:
-
嗯,通过计数/基数排序,优先级队列的排序可能会更快。同样更新(删除+插入)元素现在可以更快,因为队列可以是数组数组(或数组的排序映射)
-
在讲座Courses.MIT 中给出了解决方案(Bounded Integer Edge Weights 问题)。此外,它的时间复杂度是线性的$O(|V| + |E|)$。