下面是Dijkstra算法的具体过程的文字叙述:
(1)找出与源点(随便选一个当起始点),然后找出与之直接相连(即中间不允许有间隔)的顶点,这个一定是最短的(只有第一次选一定是,其他时候不一定),比如上图的V0~V2
(2)然后以选出的最短路径(这个就是从你目前的所有优化路径中选择),作为转发路径,找出通过这条路径转发后可到达其他顶点(指不是转发点的所有点,即通过转发点可以直接到达的点),然后会获得若干条路径,如果终点和之前已经获得的路径的目标点一样且更短,那么我们就覆盖掉,不然就不覆盖,然后重复(2);【这其实是一个遍历的过程】
思考:除了v0~V2是已知最短的,而且是一定,因为够直接,且够短,你无论怎么绕都不可能比一个直接而且短的短
其次为什么可以找到最短路径 ?因为你遍历了,首先如果从出发点可以到的话,我每次都选短的,必然可以遍历到所有点的所有邻近节点,为什么?因为一个点如果没到达最优路径就说明还没有被遍历临近点,一旦被遍历了临近点达到最优了又会不再参与后续的比较,所以一定会遍历完;然后为什么一定会是最优的
举例:假如说存在v0到v4的三条路
1: V0 10 Vn 50 v4
2:v0 55 Vm 2 v4
3:v0 50 vp 9 v4
其中数字是以两节点为顶点的弧的权重(weight)值或者叫距离,然后vn,vm,vp是任意点,你也可以把一条路径的长度边长,但不会打破下面的逻辑;
我先选择 1 然后 选择4 这不是最优的,所以真实最优的路径的(一定存在)某一部分(指V0~Vm,当然哪怕最优路径直接相连也不影响结果)肯定会小于这个,但是根据算法,我们选择3,然后59,这也不是最优的,因为真实最优路径一定存在某一部分使得该部分的路径长小于非最优路线,所以通过不断这样的选择最小路径长
核心思想的两条该怎么理解:
(1)本算法按照路径长度递增的次序,一条一条寻找最优路径:每次寻找所有未存储节点的路径中最短的那一条,盘完逻辑后发现可以完全遍历,于是形成了上表中的现象,针对每一个节点,我都是在选择短视(因为没有考虑:长远的角度下,当前选择的就近最短可能不是最短的)但是独特筛选机制(不断地比较)使得短视选项会被筛选掉,所以说长度递增,一条条寻找
(2)源点到达目标点的最短路径中的其他节点的路径必然也是最短的,这个很好理解:如果到达中间节点的路径不是最优的,那么我采取最优路径然后再按照原路从中间节点到目标节点,一定比之前那个短,所以之前那个一定不是最优路径。哪里体现了这个原理:时刻选择最小,并从最小的出发去寻找其他节点,因为当前最小才又可能是真实最小的