您的位置:首页 > 其它

关于dijkstra的贪心思想的正确性的证明

2013-05-16 19:39 316 查看
       dijkstra看似简单,其实却很有意思。

        现在发现对于一个问题,如果决心搞懂,总是会有一个难到易(初步搞懂问题),易到难(开始深入),难到易(已经深入理解)。

        我在看dijkstra的时候一开始有点迷茫,因为觉得贪心怎么会在全局上取得最优呢,结果证明是对的,我的解释就是dijkstra算法中已经把每个点都遍历过,能取最短的都已经取了,于是在想通了后觉得简单,但昨天晚上突然想找出贪心的依据,于是看《算法导论》,昨晚从十一点半看到12点10分,觉得差不多看懂了,然后睡了一觉后发现又不懂了,原本懂了的几个地方竟然完全不懂了。于是又从今天早上研究到11点,虽不能说有多透彻,但可以说差不多懂了,我在网上也看了很多关于dijkstra的证明,基本是数学归纳法,说起书写归纳法,我不得不说他是我最喜欢的数学证明方法,虽然我现在在高中阶段的课本上基本接触不到数学归纳法,但我自学《高等数学》后,特别是关于行列式的性质的数学归纳法证明,堪称断臂维纳斯般的艺术,关于数学归纳法的证明太多了,我就不写了,就写下看了《算法导论》后的通俗方法。

         一个图中的点分为两个集合,一个是V:所有点的集合;另一个是S:表明已经找到最短路径的点,即一个点找到了最短路就加入S,而我们要证的就是加入S的点的最短路都已确定。设d表示u点到源点的当前距离,z[u]表示u到源点的最短路。

        和证明整数的唯一分解定理有些类似,[u]假设一个点u是加入S集合中的第一个不满足d[u]=z[u]的点
,如果u点到源点s没有路,那么d=z[u]=无穷,就不满足z[u]=d[u]这个条件了,所以可以得出s到u一定有条最短路。[u]我们假设y点是V-S中的一点,y-u不一定存在,也就是说y有可能就是u点,然后假设x是y的紧邻前驱,但s-x也不一定存在,s点有可能为x点,因为x已经加入S了,x又是y的紧邻前驱,所以在松弛时已经计算出d[y]=z[y],(因为图中的s-u是一条最短路了,所以此路上的s-y也是s到y的最短路,否则s-u就不是s到u的最短路了)(根据收敛性质:(此中的字母与本文无关,只是描述收敛性质用到)s-u-v是图G某u点,v点属于V的最短路径,而且在松弛边(u,v)之前的任何时间d[u]=z[u],则在操作后总有d[v]=z[v]),到了这里我们就得出了两个不等式,1.在这条路径中看得出d[u]>=z[u]>=z[y]=d[y],2.在选择u点时,只有d[u]<=d[y]时,才会选到u点加入S,从而得到d[u]=d[y]=z[u]=z[y]

       从中午开始写,断断续续的写到现在才完工(下午还学了会儿相对论,简直是颠覆我的世界观,我不得不说还是数学,还有算法靠谱),虽然说高中阶段的竞赛或者以后的ACM都不用知道dijkstra的原理,但我始终觉得要学一门知识就要做到知其然并知其所以然,搞懂原理,以后也许才会创造出自己的算法。

       本文如有不妥,或者哪个地方说得不明了,请指教,会不甚感谢!如要转载,请告之并说明,谢谢!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: