前言
在学习最短路径算法的时候,对Dijkstra 算法的理解,是有点儿模模糊糊的,总是不能理解其所以然。课本上的话,看似懂了,仔细想想又疑问多多。想通了之后,将想法写在margin上,但是时间长了又忘了。为了记忆清晰,把疑问和思考过程记录下来。
一、Dijkstra 算法的引入部分
以下内容,节选自清华版92版《数据结构》,严蔚敏 著。
前提简述:
核心内容:某个原点到其它各点的最短路径。
顶点用V表示。
首先引入一个辅助向量dist,它的每个分量dist[i],表示当前所找到的从始点V到每个重点Vi的最短路径的长度。其初态为,若V到Vi有弧则dist[i]为弧上的权值,否则其值为∞。显然其中的最小值
dist[j]是从V出发的一条最短路径,记作(v,vi)
dist[i]= Min{dist[i]|Vi ∈V}
那么下一条次短路径是哪一条呢?假设该次短路径的终点是 Vk,则可想而知,这条路径或者是(V,Vk)或者是(V,Vj,Vk)…
上面几个概念的理解
1.初态的第一条最短路径
我们可以先假定这样的最短只有一条,即没有重复值的情况。如果有,那就都放到这个最短路径的集合中。
2.次短路径
首先是上面的集合是从始点出发的到其余各点的最短路径的集合,注意初态时值的规定(弧长的规定,常量和无穷的规定)。
次段路径就是从不含Vi和V的各点中找到一个点Vk,使的Vk到V的路径长度比Disk[j]稍长一点, 而比到其余的各点Vj’(除了 v,vj,vk的点)的路径长度都短。这是次短路径的含义。
3.次短路径的表达为啥是 (V,Vk)或者是(V,Vj,Vk)
这个地方不知道大家理解是否顺畅,我仔细想了一下,感觉还是得把中间的过程记下来更好。
可想而知这条路径是(v,vk)或者V,Vj,Vk)…为什么呢?
首先要理解这个前提,即vk是次短路径的终点,起点就是V。也就是说,次短路径中的首末点必须是V和Vk。那么中间点可能是啥呢?有可能是Vj’吗?或者更多的其他点?
分析如下:
1、首先假设最短路径都是唯一的,即不存在重复值。
1.1如果次短路径是 (V,Vj,Vk)
假设存在 Vj’ 点使得(v,vj’,vk)是次短路径,那么(v,vj‘)必然小于(v,vj’,vk),也就是(v,vj‘)比次短路径短,即(v,vj’)是最短路径(为啥?这个路径是次短路径,比它短的就只能是最短路径)。根据唯一性,j’=j,也就是说次短路径只能是(v,vj,vk)。
1.2 如果次短路径是(v,vk),那么这个就没啥说的了,因为只能是它,这是我们的假定(Vk是假定的,如果Vj’,比它合适,那么令 Vj’ 是Vk就好了。注意假定这个前提…)。
2、如果最短路径不唯一,即存在重复值
假设最短路径有多个同样的值,j1,j2…,通过上面的分析次短路径也必然是经过 这些Vj,选择其中最短的那个Vkn 作为Vk就可以了。
二、Dijkstra 算法的涉及的引理部分
教材内容转述如下:
假设S为求得的最短路径的集合,可以证明:下一条最短路径(设其终点为x),要么是弧(v,x)要么是 只 经过 s中的点到达最后的点x的路径。
教材上采用的反证法:假设此路径中有一个点不再S中,则存在一条终点不在s而路径而长度比这个路径短的路径,这是不可能的。
我们仍然采用上面次短路径分析的方法来详细说明一下。假设这个点是 s’, 那么这个短路径可以描述为(V,s1,s2… s’, s’1…X), 则路径(V,s1,s2… s’) 必然小于 (V,s1,s2… s’, s’1…X) (注意这个路径是我们假定的递增的一条短路径),而该路径是仅仅比S中的路径递增一点儿的路经,所以(V,s1,s2… s’)路径必然是最短路径中的一条,即s’必然是S集合中的一个元素。这就证明了上面的引理。
我认为这个比反证法更好理解一些。
另外这里面有数学归纳法的味道。
总结
理解一个推论的前提和假定非常重要,有时候会陷入后面的陷入为主的漩涡中,而忽略了前面的假定。另外,在计算机的诸多算法中,前提和动态推演是经常遇到的一种思路或者方法。由于人脑(大多数)在动态推演过程中会很困难,因此对某些结论的理解就会很困惑。反正,笔者是这样的,对这种递归定义和使用临时假定的推理过程的理解费劲。往往是机械的接纳了书上的结论,其实并没有知其所以然。
是记
MaraSun BJFWDQ
4-14 荣成马拉松。
2015

被折叠的 条评论
为什么被折叠?



