我正在寻找一种类似于 dijikstra 的算法,但速度更快。我必须解决同样的问题 - 从给定节点开始找到到所有节点的最短路径。但我的老师告诉我,我应该找到一种更快的算法,因为 dijikstra 可能会很慢。我还想问,我是否可以使用弗洛伊德马歇尔的算法来完成该任务
这里是这个问题的一个解决方案,如果所有的弧都是非负的,否则是贝尔曼-福特。 要获得所有最短路径:
仅从一个节点v开始,从v开始,而不是从你的根开始。在最坏的情况下,你的节点 v 无论如何都是根。所以时间复杂度仍然= O(|V|+|E|)。
请参考下表做出最佳选择。
算法 | 时间复杂度(大O) | 空间复杂度(大O) | 直接图还是非直接图? | 处理循环图? | 处理负边权重? | 什么时候使用? |
---|---|---|---|---|---|---|
Dijkstra 算法 | (E+V)LogV | V | 两者 | 没有 | 没有 | 获取从单个源到所有顶点的最短路径 |
贝尔曼-福特算法 | VE | V | 两者 | 不适用于负体重周期 | 是的 | 获取从单个源到所有顶点的最短路径 |
拓扑排序算法 | V+E | V | 直接 | 没有 | 是的 | 获取从单个源到所有顶点的最短路径 |
Floyd-Warshall 算法 | V^3 | V^2 | 两者 | 不适用于负体重周期 | 是的 | 获取从所有顶点到所有顶点的最短路径 |