关于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实现
在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...
随机推荐
- rancher下的kubernetes之一:构建标准化vmware镜像
学习kubernetes的时候,我们需要在kubernetes环境下实战操作,然而kubernetes环境安装并不容易,现在通过rancher可以简化安装过程,咱们来实战rancher下的kubern ...
- php开发中一些前端知识杂总
推荐几个jqyuey插件的好地方 http://jqueryui.com/ http://www.jq22.com/ 背景: 服务端采用ci3.0框架,twig作为模板嵌套. twig模板手册: ht ...
- BZOJ1026 SCOI2009 windy数 【数位DP】
BZOJ1026 SCOI2009 windy数 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B ...
- 使用不安全代码将 Bitmap 位图转为 WPF 的 ImageSource 以获得高性能和持续小的内存占用
在 WPF 中将一个现成的 Bitmap 位图转换成 ImageSource 用于显示一个麻烦的事儿,因为 WPF 并没有提供多少可以转过来的方法.不过产生 Bitmap 来源却非常多,比如屏幕截图. ...
- tableview小结-初学者的问题
初学者的问题主要集中在,下面几个问题: 一.几个函数总是不被调用:例如: - (UIView *)tableView:(UITableView *)tableView viewForHeaderInS ...
- mysql 查找除id外其他重复的字段数据
如表 test1 有多个重复的字段 其中有些数据完全重复是错误的数据,我们要把他找出来,然后删除掉 select * from test1 a where (a.phone,a.name) in ( ...
- [BZOJ5361][Lydsy1805月赛]对称数
bzoj Description 给你一棵树,每个点有一个编号\(a_i\).\(Q\)组询问,每次问一条路径上最小的出现了偶数次的编号是多少(包括零次). 多组数据,\(T\le10,n,Q,a_i ...
- MTK-shot mode
enum EShotMode{ eShotMode_NormalShot, /*!< Normal Shot */ eShotMo ...
- drone 学习六 发布部署&&集成私有容器仓库&&构建代码s3 保存
备注: 需要进行drone 以及gitlab 环境的配置,可以参考相关资料 1. 参考项目 https://github.com/rongfengliang/drone-appdemo ...
- 【转】MFC对话框和控件
原文网址:http://www.cnblogs.com/tiwlin/archive/2013/05/08/3067966.html 对话框和控件 对话框是Windows应用程序中一种常用的资源,其主 ...