关于Dijkstra算法

以前一直认为美国的教学方式非常先进。到了美国留学以后忽然发现,无论中国的算法课还是外国的算法课。讲一个算法,教授们都喜欢直接摆逻辑,摆例子。他们往往或不说,或不愿意说这个算法到底怎么就被人想出来了。也就是说,为什么要这么计算?这么计算的好处是什么?这么计算为什么正确?讲的很少。

就拿Dijkstra算法举例。算法内容不复杂,wiki上有直接的图例,非常清晰。这里,我不再对Dijkstra的算法本身以及相关定义和性质做更多的重申。

第一次for循环时,我们观察与s相邻的节点A,C,D,发现sA的distance最小,因此sA为到达A的最短路径。到这一步,我们需要清醒的意识到,为什么当我们观察s点发散出的三条线中,那条最短的线段所连接的点的路径值可以被立即认定为源点到达改点的最短路径值?这是因为,s到所有其他点的距离都比这个值大(5 to C,2 to D),也因此无法找到更优的路径。比如说,在这个途中,从s出发,以C为中间点,我们是不可能找到其到达A的更短路径的,因为这条路径的值一定会比sC的举例5还要大。因此,我们可以放心地把当前累计最小路径放心地列为最优路径。

分析到这里,我们也很容易理解,为什么当距离权重中有负值的时候,Dijkstra就不适用了。因为,即使我们可以在当前判断出1为(1,5,2)三个数中的最小值,但由于负性距离权重的存在,我们不敢下结论,通过C点或者通过D点我们就找不到更优解了。比如说,我们让CA = -5。这时我们发现s->C->A比s->A更小。这就是当存在负距离权重时,我们无法使用Dijkstra的原因。

这只是众多算法当中一个非常简单的例子,私以为我们学习算法,了解他的来龙去脉以及正确性是非常有必要的。这对我们记忆算法理解算法乃至激发灵感有着重要的作用。

猜你喜欢

转载自blog.csdn.net/tommy_1994/article/details/80568265