狄克斯特拉算法包含四个步骤:

1·找出“最便宜的节点,即可在最短时间内到达的节点”

2·更新该节点的邻居的开销

3·重复这个过程,直到对图中的每个节点都这样做

4·计算最终路径

 

1·第一步:找出最便宜的节点。你现在站在起点,不知道应该前往A节点还是B节点,那么前往这两个节点应该花费多长时间呢?(开始选定一个起点)假设前往节点A需要6分钟,而前往节点B需要2分钟,至于前往A和B之后的那些节点要花费的时间,现在你还不知道,而且由于你还不知道前往终点的时间,因此你假设为无穷大。现在来看从起点前往节点B是最短的用时(2分钟)

2·第二步:计算经节点B前往它的各个邻居需要花费的时间。对于节点B的邻居,如果找到前往它的更短的路径,就更新其开销

3·第三步:重复。重复第一步:找出可在最短时间内前往的节点,你现在对节点B执行了第二步,除了节点B外,可在最短时间内前往的节点是节点A。重复第二步:更新节点A的所有邻居的开销

 

当你对每个节点都使用狄克斯特拉算法,你会发现

1·从起点前往节点B需要2分钟

2·从节点B前往节点A需要5分钟

3·从节点A前往终点需要6分钟

 

 

# 需要注意的是:如果我们使用广度优先搜索,找到的“最短路径”将不是上述的这条,因为这条路包含了3段,而重新来看的话有一条路径从起点到终点一共只有2段

# 我们使用广度优先搜索来查找2点之间的最短路径,那时的“最短路径”的意思是段数最少。而在狄克斯特拉算法中,给每一段路径都分配了一个“时间数值”因此狄克斯特拉算法找出的是总权重最小的路径

# 狄克斯特拉算法背后的关键理念是:找出图中最便宜的节点,并确保没有到该节点更短的路径

# 当然这里所说的最短路径并不一定指的是物理距离,也可能是让某种度量指标最小

 

 

再重复一下狄克斯特拉算法的4个步骤:

1·找出最便宜的点,即可在最短时间内前往的节点。

2·对于该节点的邻居,检查是否有前往它们的更短的路径,如果有这种路径,就更新其开销。

3·重复这个过程,直到对途中的每个节点都这样做了

4·计算最终路径(后面的随笔会解释是如何计算最终路径的)

 

分析与起点(令起点为父节点)相连的几条岔路后,再确定第二个隘口(记录花销)(将第二个隘口作为新的父节点,后面同理),之后再分析从第二个隘口前往第三个(也是分析与第二个隘口相连的几条岔路后决定第三个隘口)隘口的花销......重复上述步骤,直到到达终点,将前面从起点到第二个隘口,从第二个隘口到第三个隘口,等等的花销进行累加。

当“顺序走完全程”并进行逐路分析后,为了确定最终的路径,由终点,一个隘口,一个隘口的进行回溯,最终到达起点,才能确定最终的路线(即由子节点找父节点)

 

 

# 实现代码如下: