关于Floyd-Warshall算法由前趋矩阵计算出的最短路径反映出了算法的执行过程特性的证明
引言:Floyd-Warshall算法作为经典的动态规划算法,能够在O(n3)复杂度之内计算出所有点对之间的最短路径,且由于其常数较小,对于中等规模数据运行效率依然可观。算法共使用n此迭代,n为顶点个数。其中第k次迭代计算出每对顶点之间所有中间结点小于等于k的最短路径长度,其中i到j的最短路径要么是经过k的一条路径,这条路径的由k所分割出的两个路径i → k、k → j是中间路径小于等于k-1的最短路径;要么是从i到j的中间路径小于等于k-1的最短路径。定义dij(k)为从i到j的最短路径长度,可以形式化地表示其计算方法:
(1)
算法为了得出最短路径的所有中间结点,维护前趋矩阵Π。其元素 πij 表示从i到j的最短路径上j前一结点,其计算方法如下:
(2)
(3)
从前趋矩阵得出最短路径所有结点的方法如下:
PRINT-SHORTEST-PATH (i, j, Π)
1 STACK ← Ø
2 while j ≠ i
3 PUSH (STACK, j)
4 j ← Π (i, j)
5 PUSH (STACK, j)
6 while STACK ≠ Ø
7 v ← POP (STACK)
8 print v
问题描述:关于Floyd-Warshall算法的细节请参见《算法导论》或其他算法专著,笔者在阅读《算法导论》相关章节的时候萌生了关于题目所述问题的猜想,表述如下:算法最终得出dij之前,一定在之前的某个第k次迭代对dij(k)做了使其等于dik(k-1) + dkj(k-1)的赋值,假设k为最后这一次这样的迭代,那么算法隐含了这样一个信息:最终从i到j的最短路径中间经过k,且从i到k和从k到j的中间路径小于等于k-1。而从i到k和从k到j亦符合类似的模式,这样一直递归下去,直到得到的两个点的最短路径为图中一条边。可以为所有最短路径构造一棵树表示这个过程。举例来说,对于路径3257416,其相对应的反映了算法构造路径过程的树为:
图1
那么,由PRINT-SHORTEST-PATH所得出的路径是不是就这样一条路径呢?答案竟然是肯定的。下面将会给出证明,其中,推论1的证明使用了最短路径的一些性质,而结论的证明使用的就是算法证明里最重要的递归思想和数学归纳法。
首先给出并证明一个比较重要的推论。
推论1:若在第k次迭代,某个从i到j的路径经过了k,令m = πij(k),如果m ≠ k,则从i到m的路径也经过k。
证明:由于πkj(k-1) = πij(k)= m,即,从k到j的中间结点小于等于k-1在最短路径中,j的前趋为m,所以有
dkj(k-1) = dkm(k-1) + wmj (4,最短路径的最优子结构性质)
其中wmj为边(m, j)的权值。
因为从m到j有一条边,由最短路径的三角不等式可得:
dij(k-1) ≤ dim(k-1) + wmj (反证即可得)
即
dim(k-1) ≥ dij(k-1) - wmj (5)
由条件可知
dij(k-1) > dik(k-1) + dkj(k-1)
两边减去wmj,得
dij(k-1) - wmj > dik(k-1) + dkj(k-1) - wmj = dik(k-1) + dkm(k-1) (由4)
即
dij(k-1) - wmj > dik(k-1) + dkm(k-1)
得证
结论:对由PRINT-SHORTEST-PATH所得出的路径构造一颗如图1所示的树,这颗树反映了Floyd-Warshall算法构造最短路径的过程。
证明:利用数学归纳法,显而易见,第一次迭代之前,对初始的前趋矩阵应用PRINT-SHORTEST-PATH函数得到的路径反映了算法初始时没有中间结点的最短路径的构造过程。
接下来,假设,算法对第k-1次迭代所得的前趋矩阵Πk-1,应用PRINT-SHORTEST-PATH函数得到的路径,反映了算法构造中间结点小于等于k-1的最短路径的过程。并根据这个假设,证明算法对第k次迭代所得的前趋矩阵Πk,应用PRINT-SHORTEST-PATH函数得到的路径,反映了算法构造中间结点小于等于k的最短路径的过程即可。
1. 对于某个从i到j的算法所构造出的中间结点小于等于k的最短路径,若其不经过k,有 dij(k) = dij(k-1),πij(k) = πij(k-1) = m,对其应用PRINT-SHORTEST-PATH函数可得序列:
πij(k) = m
πim(k) = n
...
πio(k) = p
πip(k) = i
对于其中任意一个 πix(k),其一定等于πix(k-1),即从i到这条路径中任意一个x的最短路径都不会经过k,否则就会与假设矛盾。因此有:
πij(k) = πij(k-1) = m
πim(k) = πim(k-1) = n
...
πio(k) = πio(k-1) = p
πip(k) = πip(k-1) = i
即根据Πk所计算出来的从i到j的路径等同于根据Πk-1所计算出来的从i到j的路径。由于根据Πk-1所计算出来的路径是符合性质的中间结点小于等于k-1的路径,因此根据Πk,对任意不经过k的最短路径应用PRINT-SHORTEST-PATH函数计算出的路径即是符合性质的中间结点小于等于k的路径。
2. 若从i到j的路径经过k,即
dij(k) = dik(k-1) + dkj(k-1),πij(k) = πkj(k-1)= m
由推论1可得,根据Πk,对从i到j的最短路径应用PRINT-SHORTEST-PATH函数计算出的路径一定会到达k,且有:
πij(k) = πkj(k-1) = m
πim(k) = πkm(k-1) = n
...
πio(k) = πko(k-1) = p
πip(k) = πkp(k-1) = k
这个从k到j的序列的所有点都来自Πk-1,所以它是符合性质的中间结点小于等于k-1的路径。
而对于从i到k的序列,由于其不经过k,因此根据1,也是符合性质的中间结点小于等于k-1的路径。
由于路径从k一分为二且k为所有中间结点中最大的那个,所以这条路径符合所构造的树先从最大的中间结点分开的性质。而分开的两条路径又分别是符合性质的中间结点小于等于k-1的路径,因此第k迭代构造的经过k的路径是符合性质的中间结点小于等于k的路径。
综上所述,可以得出结论
关于Floyd-Warshall算法由前趋矩阵计算出的最短路径反映出了算法的执行过程特性的证明的更多相关文章
- 图论之最短路径(1)——Floyd Warshall & Dijkstra算法
开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...
- 最短路径问题:弗洛伊德算法(Floyd)
Floyd算法 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被 ...
- poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数
poj 1523Tarjan算法的含义——求取割点可以分出的连通分量的个数 题目大意:如题目所示 给你一些关系图——连通图,想要问你有没有个节点,损坏后,可以生成几个互相独立的网络(也就是连通分量), ...
- 目标反射回波检测算法及其FPGA实现 之三:平方、积分电路及算法的顶层实现
目标反射回波检测算法及其FPGA实现之三: 平方.积分电路及算法的顶层实现 前段时间,接触了一个声呐目标反射回波检测的项目.声呐接收机要实现的核心功能是在含有大量噪声的反射回波中,识别出发射机发出的激 ...
- 最短路径问题 3.Bellman-Ford算法
简要:Bellman-Ford算法计算的仍然是从一个点到其他所有点的最短路径算法,其时间复杂度是O(NE),N表示点数,E表示边数,不难看出,当一个图稍微稠密一点,边的数量会超过点数那么实际上效率是低 ...
- 算法导论-散列表(Hash Table)-大量数据快速查找算法
目录 引言 直接寻址 散列寻址 散列函数 除法散列 乘法散列 全域散列 完全散列 碰撞处理方法 链表法 开放寻址法 线性探查 二次探查 双重散列 随机散列 再散列问题 完整源码(C++) 参考资料 内 ...
- Floyd-Warshall算法:求结点对的最短路径问题
Floyd-Warshall算法:是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包. 原理: Floyd-Warshall算法的原理是动态 ...
- 一小部分机器学习算法小结: 优化算法、逻辑回归、支持向量机、决策树、集成算法、Word2Vec等
优化算法 先导知识:泰勒公式 \[ f(x)=\sum_{n=0}^{\infty}\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n \] 一阶泰勒展开: \[ f(x)\approx ...
- [从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现
在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...
随机推荐
- Java基础部分全套教程.
这是我自己早前听课时整理的java基础全套知识,使用于初学者,也可以适用于中级的程序员,我做成了chm文档的类型,你们可以下载 笔记是比较系统全面,可以抵得上市场上90%的学习资料.讨厌那些随便乱写的 ...
- [IC]Lithograph(1)光刻技术分析与展望
文章主体转载自: 1.zol摩尔定律全靠它 CPU光刻技术分析与展望 2.wiki:Extreme ultraviolet lithography 3.ITRS 2012 1. 光刻技术组成和关键点 ...
- iPhone开机键坏了如何开机
作死 开机 [苹果手机/iphone开机键坏了怎么开机]
- 特性属性 @property
实现其它语言所拥有的 getter 和 setter 的功能 作用: 用来模拟一个属性 通过@property 装饰器可以对模拟属性的取值和赋值加以控制 class Student: def __in ...
- 通过拖拽prefab来存储相应的路径
更新了一下,支持数组和嵌套数据结构. using UnityEngine; using System.Collections; using UnityEditor; using System.Refl ...
- matlab图像处理注意溢出!先要im2double!
imagedata_comb=imagedata_ebic*addnumber_ebic+imagedata_sem*addnumber_sem; %注意溢出啊!!!uint8最大值是255,也就是说 ...
- HttpClient通信
1.背景 大多数系统功能和代码都是自己写的,自己用,但是在有些情况下,我们可以利用已经存在的系统,完成对自己实现相对很麻烦的功能,这些一般代价相对较大,自己不可能专门写一个系统或者太过很复杂的代码来完 ...
- 如何快速编写和调试 Emit 生成 IL 的代码
.NET Core/.NET Framework 的 System.Reflection.Emit 命名空间为我们提供了动态生成 IL 代码的能力.利用这项能力,我们能够在运行时生成一段代码/一个方法 ...
- ubuntu scrapy 开发环境搭建
我的版本是14.04 1.更新系统 ##如果系统没有换国内下载路径需要换下系统的更新下载路径 http://www.cnblogs.com/seablog/p/7043798.html sudo a ...
- python pandas 对各种文件的读写 IO tools
The pandas I/O API is a set of top level reader functions accessed like pd.read_csv() that generally ...