算法基础——最短路径
编辑时间:2023/11/2
最短路径概述
- 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图中两结点之间的最短路径。
- 最常用的路径算法有:
- Dijkstra算法
SPFA算法\Bellman-Ford算法
Floyd算法\Floyd-Warshall算法
Johnson算法
Dijkstra算法深度优先遍历算法步骤
红点=确定了最短权值和的点
绿点=搜索了但未确定的点
白点=未搜索的点
- 设立红点、绿点、白点 设置起始点为红点,
- 标记绿点:将最近的点标记为绿点,计算开始到此点的权值和
- 标记红点:将计算好的绿点权值和最小的点标记/更新为红点
- 继续遍历:将新标记的红点为起始点,继续搜索重复2、3步骤,
- 直到搜索点全部结束,将最终点,回溯到起始点,结果的点为最短路径,最终点的权值和为最短路径长度。
案例
问题描述
如图,求从起始点0到终点4的最短路径问题。
解题思路
算法描述
时间复杂度和空间复杂度分析
- Dijkstra算法是一种用于解决单源最短路径问题的贪心算法。它的时间复杂度和空间复杂度取决于具体实现方式。
- Dijkstra算法的具体实现方式有多种,包括朴素Dijkstra算法、优先队列优化Dijkstra算法、二叉堆优化Dijkstra算法和斐波那契堆优化Dijkstra算法。一般来说,Dijkstra算法的时间复杂度为O(m + nlogn),其中m为边数,n为顶点数。空间复杂度为O(n)。
- 朴素Dijkstra算法的时间复杂度为O(n^2),空间复杂度为O(n),但是在稠密图中表现良好。而优先队列优化Dijkstra算法、二叉堆优化Dijkstra算法和斐波那契堆优化Dijkstra算法的时间复杂度均为O(m+ nlogn),但是在不同的情况下表现不同。
总结
Dijkstra算法的应用非常广泛,例如路由算法、地图导航等。在路由算法中,Dijkstra算法可以用于计算从源节点到其他所有节点的最短路径。在地图导航中,Dijkstra算法可以用于计算从起点到终点的最短路径。