bfs:广度优先搜索,暴力,时间复杂度跟图的边数有关,树的层序遍历,求无权图的单源最短路,队列
dijkstra:贪心,时间复杂度n的平方,可以用堆优化到nlogn,求带权图的单源最短路
SPFA:dp,队列优化的求单源最短路,时间复杂度n的3次方, dijkstra不能处理带负权边和回路,SPFA可以解决,可以判断图中是否有回路
floyd:dp,时间复杂度n的三次方,求带权图的多源最短路,可以判断图是否有回路
dijkstra:贪心,时间复杂度n的平方,可以用堆优化到nlogn,求带权图的单源最短路
SPFA:dp,队列优化的求单源最短路,时间复杂度n的3次方, dijkstra不能处理带负权边和回路,SPFA可以解决,可以判断图中是否有回路
floyd:dp,时间复杂度n的三次方,求带权图的多源最短路,可以判断图是否有回路
| 求解方向 | 算法类型 | 时间复杂度 |
BFS | 求无权图的单源最短路/求树的层序遍历(队列) | 暴力搜索 | O(V+E),与边有关。最坏的情况就是这个图是完全图,无向完全图有个公式是E = V*(V-1)/2,V=100,则E=10^4,主要由边决定 |
Dijstra | 求带权图的单源最短路(非负权,不可判断是否回路) | 贪心 | O(V^2),可以用堆优化到O(VlogV) 当是稀疏图的情况时,此时E=V*V/lgV,所以算法的时间复杂度可为O(V^2) 。若是斐波那契堆作优先队列的话,算法时间复杂度,则为O(V*lgV + E)。 |
SPFA | 队列优化的求带权图的单源最短路(可负权,可判断是否回路) | 动态规划 | O(kE),其中k<<E |
Floyd | 求带权图的多源最短路(可负权,可判断是否回路) | 动态规划 | O(V^3),空间O(V^2) |
Dijstra与SPFA区别:Dijkstra不能处理带负权边和回路,SPFA可以解决,可以判断图中是否有回路。但是在非负边权图中,为了避免最坏情况的出现,通常使用效率更加稳定的Dijkstra算法,以及它的使用堆优化的版本。 | |||
BFS有2个功能:一个是遍历,与DFS类似,时间复杂度都是O(V+E)。另一个是是求无权图最短路 |