-
Dijkstra算法:时间复杂度O(n3),属于贪心算法的一种,缺点:无法判断含负权边的图的最短路。
-
Floyd算法 : 时间复杂度O(n3),属于动态规划的一种,最慢但是最简单
-
Bellman-Ford:求含负权图的单源最短路径的一种算法,效率较低,代码难度较小。其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无法得出结果,否则就完成。
-
SPFA:SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环。SPFA 最坏情况下复杂度和朴素 Bellman-Ford 相同,为 O(VE)
首先,在不考虑时间复杂度的情况下,同是解决图论中最短路径的寻找的问题。这个基础的问题之上还可以引申出很多其他的理论或是实际应用问题。Dijkstra进行进一步的堆优化以后时间复杂度成为O(nlogn),比起Floyd的O(n3)是小了非常非常多。但是Dijkstra,以及常用的还有Bellman-Ford,SPFA等,均是在求单源最短路径的问题中有着较为理想的时间复杂度(<=O(n2)),但若是求图中任意两点间的距离,尤其是在图较为稠密时,Floyd的O(n^3)也是不输于其他的。另外Floyd有一个优势,那便是写起来简单。插点的简单思想,三重循环加一个判定,五行就写完了。而Dijkstra在堆优化后、以及SPFA,则需要约50行的代码。
作者:北海若 链接:https://www.zhihu.com/question/267648211/answer/327117780
来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。