最短路径算法对比分析
Floyd | Dijkstra | Bellman-Ford | 队列优化 Bellman-Ford | |
---|---|---|---|---|
空间复杂度 | o(N^2) | o(M) | o(M) | o(M) |
时间复杂度 | o(N^3) | o((M+N)logN) | o(NM) | 最坏情况o(NM) |
适用情况 | 稠密图 和顶点关系密切 | 稠密图 和顶点关系密切 | 稀疏图 和边关系密切 | 稀疏图 和边关系密切 |
负权 | 可以解决负权 | 不能解决负权 | 可以解决负权 | 可以解决负权 |
Floyd算法虽然总体时间复杂度高,但是可以解决负权边,并且均摊到每个点上,
在所有的算法中还是属于较优的。
另外,Floyd算法较小的编码复杂度也是它的一大优势。
所以,如果要求的是所有点对间的最短路径,或者如果数据范围较小,则FLoyd算法较合适。
Dijkstra算法最大的弊端是它无法适应有负权边的图。
但是DIjkstra具有良好的可拓展性,拓展后可以适应很多问题。
另外用堆优化的Dijkstra复杂度可达到o(MlogN)。
当边有负权时,需要使用Bellman-Ford算法或者队列优化的BF算法。
因此我们选择最短路径算法时,要结合其特性来选择。
摘自《啊哈!算法》