【问题标题】:When will Dijkstra's algorithm and Prim's algorithm produce different outputs?Dijkstra 算法和 Prim 算法何时会产生不同的输出?
【发布时间】:2013-10-21 09:14:23
【问题描述】:
我知道 Prim 算法和 Dijkstra 算法之间的区别。前者产生一个 MST,而后者给出从源到所有节点的最短路径。从数学上讲,它们并不相同,因此我们并不总是期望这两种算法产生相同的结果。
但是,在尝试不同的示例时,我得到了相同的结果。 Prim 算法和 Dijkstra 算法的伪代码看起来也非常相似。有人可以举个例子,Prim 产生的 MST 在使用 Dijkstra 解决时无法获得,反之亦然。
另外,据我所知。这两种算法都使用以下方法。如果我错了,请纠正我:
从集合中找到最短的 i-j,其中 i 已经包含在其中
从尚未包含的集合中,然后将 j 添加到集合中。
【问题讨论】:
标签:
algorithm
graph
graph-algorithm
dijkstra
prims-algorithm
【解决方案1】:
一个简单的例子是放置在正方形角落的四个节点的集合。将成本 2 的边放置在任意两个相邻角之间,并将成本 3 的边沿对角线穿过正方形。从任何角落运行 Dijkstra 算法都会选择这些边:
* -- *
| \
| \
* *
这些是最短路径,边的总成本是 7。
运行 Prim 的算法将挑选这些边缘:
* -- *
|
|
* -- *
这是一个 MST(总边缘成本为 6),但这些不是最短路径(从左上角到右下角的路径成本为 4,但可能有更直接的路径。)
作为一个挑战:尝试找到图表
- Dijkstra 算法找到比实际 MST 重 Ω(n) 倍的最短路径树,并且
- Prim 的算法会找到一个 MST,其中树中的路径比相应的最短路径树中的路径长 Ω(n) 倍。
Prim's 和 Dijkstra's 都通过找到某个不在集合中的节点并将其带入集合来选择节点,但它们在调整距离的方式上有所不同。在 Prim 算法中,使用的距离始终是从集合外的任何节点到集合内的任何节点的最小距离。在 Dijkstra 的算法中,距离是以下值中的最小值:
距离(起始节点,u)+ l(u,v)
换句话说,Dijkstra 的算法会考虑从起始节点到集合外节点的距离,而 Prim 的则不会。
希望这会有所帮助!