迪杰斯特拉算法是求出图中两点之间最短路径的算法,以下是原理介绍:
现在我们要求出0到6的最短路径,将每个点与其自身的距离设为0,初始时任意连个点之间的距离设为无穷,该算法的第一步就是找出0点与其直接相连的两个点之间的距离分别是多少,根据图中可以看出0和1 2相连并且权重分别是5 2,下一步是将与0点距离最近的点,即2,纳入到已访问点的集合中,{0,2},(目前未访问点的集合是{1,3,4,5,6}),然后我们继续找与0点距离最近的点,从与2 直接相连的点和与0直接相连的点中找。与2直接相连的点有3和5,与0直接相连的点还有1,现在我们要比较待选的这三个点到0 的距离,可以看出1对应的是5,3和5对应的均是8,而迪杰斯特拉算法的思想就是始终选取距离初始点距离最短的点纳入到已访问点集合中,因此在这3个待选的点中我们选取1纳入,已访问点更新为{0,1,2},未访问点{3,4,5,6}。然后继续,我们需要从1 和2 继续向外延伸并且找到延伸出的待选点中距离0最近的点,因此分别对2 和1重复上面的延伸操作,先选2,与2直接相连的是3和5,这两个备选点距离0的距离都是8,再选取1,其直接相连的是3和4,这两个备选点距离0的距离分别是6和11,接着从所有待选点中找出距离0最近的那个,可以看出是3,因此将它纳入到已访问点集合中,{0,1,2,3},未访问点集合{4,5,6}。接着从2和3往外延伸重复上述过程,这次4被纳入已访问点集合,未访问点集合{5,6}。接着继续从2和4向外延伸,这次5被纳入已访问点集合因为此时5距离0距离最近是8,而6是14,这样已访问点集合变为{0,1,2,3,4,5},未访问点集合{6}。最后从5和4向外延伸都到了6,很显然,走0 1 3 6得到的距离是最短的是11。
已访问点集合中每轮都有最前面向外延伸的点,这些点身上背负的都是他们各自距离初始点的最近的距离,因此,最后轮到4和5向外延伸时,5背负的是8,4背负的是7,他们同时延伸到6以后,5-6距离为3,4-6距离为7,我们选取距离最短的,这样最终最短距离就找到了,并且可以保证一路走来每个向前延伸的点背负的都是他们各自距离初始点的最近的距离,到最后找到的一定是最短距离。
借用原博客动图迪杰斯特拉(Dijkstra)算法_dijkstra算法-CSDN博客(侵权删)
但似乎我给出的解释跟这篇文章里的不太一样,我的理解就是已访问点集合中的最前沿的那些点向前延伸,将得到的备选点中选取距离初始点最近的纳入已访问点集合,这个理解大致与动图上是对应的,就是到最后4被纳入已访问点以后似乎不是很直观
wiki上的动图,按照我给出的解释是可以找到正确答案的,理解应该没什么问题。这个图,到最后已访问点集合的最外延是6,4还处于未访问点,6的直接相连是5,5此时距离1最短为20,而4是22,因此5被纳入已访问点,查找结束,最短距离是20.
就这样吧,琢磨了很长时间终于找到一种自己可以接受的解释了,这东西,自己理解加上自己的语言最重要。