首先理解下Dijkstra的数学基础。见如下图片:(图片摘自(77条消息) 迪杰斯特拉算法(Dijkstra)证明_肥宅Sean-CSDN博客_dijkstra证明)
为什么选这张图片呢?因为当时我就是从这张图片所讲的开始理解,并产生疑问,再解决疑问的。
首先 ,要将中的点加入到中并需要是中距离(起始点)最小的点原因是使得到之间的最短路径所经过的点都是在中。
其次,要注意已经加入到中的点实际上都已经保证了自己到之间的距离一定是最小的了。
那么,接下来要向中的点无非也是要保证距离起始点的距离是最小的了,那么对中的各点{},要找出各点距离起始点距离最小的值并进行比较,那就是要计算比较
而实际上,每加入一个新点后,我们都会队每个中的点到之间的距离进行更新,即 (1)
是刚被加入到中的点。
这一步就使得我们不用再在每次需要添加新点时,对每个计算,所以公式(1)就类似与优胜劣汰,在每次添加新点的这种循环视角看来,就是相当于做了,因此我们只需要比较上一步留下来的最短距离与对进行更新即可。所以有了图片中的步骤2和3。