Dijkstra算法(迪杰斯特拉算法)
迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。
是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。
迪杰斯特拉算法求一个点到其他所有点的最短路径时间复杂度为 O(n^2)。
我第一次接触到Dijkstra算法是在离散数学的图论课上,关于计算最短路径问题的算法
下面举个例子来解释Dijkstra算法:
其实很容易看出这个有权图以A为起始点的最短路径,但还是按照迪杰斯特拉算法的思想简单介绍一下
可以设定有两个集合S和U。
初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是“起点s到该顶点的路径”。然后,从U中找到路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。然后,再从U中找到路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。……重复该操作,直到遍历完所有顶点。
----- S是已计算出最短路径的顶点的集合
----- U是未计算出最短路径的顶点的集合
- 假设A为起始点,S={A(0)}
U={C(4),B(3),D(∞),E(∞),F(∞),G(∞)} - 选择顶点B,S={A(0),B(3)}
U={C(4),D(8),E(∞),F(∞),G(∞)} - 选择顶点C, S={A(0),B(3),C(4)}
U={D(5),E(),F(∞),G(∞)} - 选择顶点D,S={A(0),B(3),C(4),D(5)}
U={F(7),E(13),G(∞)} - 选择顶点F, S={A(0),B(3),C(4),D(5),F(7)}
U={E(13),G(13)} - 选择顶点E, S={A(0),B(3),C(4),D(5),F(7),E(13)}
U={G(13)} - 选择顶点G, S={A(0),B(3),C(4),D(5),F(7),E(13),G(13)}
U={}
我也不清楚要不要省略第六步,毕竟E点和G点都是13,不过按照规则是要遍历完所有顶点,我认为第六步对最后的结果没有影响
刚学这个算法,如有错误,请各位大佬指正。
以后如果有更深入的理解,我会补上的。