关于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实现
在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...
随机推荐
- vue中父子组件值的传递
父传子 父组件:
- 【剑指offer】输入一颗二叉树的根节点,求二叉树的深度,C++实现
原创博文,转载请注明出处! # 题目 # 举例 下图二叉树的深度为4,最长路径为1-2-5-7. # 思路(递归) 如果一个树只有一个节点,它的深度为1: 如果根节点只有左子 ...
- bzoj 4811 由乃的OJ
bzoj 4811 由乃的OJ 考虑树链剖分. 树剖后用一颗线段树维护一段连续区间,类似于一个函数,各位上进入 \(0/1\) ,输出的数字分别是什么.注意到最多只有 \(64\) 位,可以用一个 \ ...
- BZOJ1015: [JSOI2008]星球大战starwar【并查集】【傻逼题】
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...
- MySQL排序_20160926
在工作中对数据进行排序也是最常用的,比如根据用户的下单金额降序 或者对销售业绩进行降序排序 在考核员工KPI时候也经常用到 一.order by 函数 order by 函数默认根据后面字段升序,使 ...
- 20165212 预备作业3 Linux安装及学习
20165212 预备作业3Linux安装及学习 Linux虚拟机的安装过程 我像大部分同学一样,通过助教学姐给的Ubuntu下载地址下载映像文件.VB,但是屡次出现问题,不停的闪出一下错误提示窗口: ...
- php中strstr、strchr、strrchr、substr、stristr
一.strstr 和 strcchr的区别 strstr 显示第一次找到,要查找的字符串,以及后面的字符串. strrchr 显示最后一次找到,要查找的字符串,以及后面的字符串. 二.strstr ...
- DB time VS. DB CPU
如何行之有效地展示系统负载在做系统调优的时候是必不可少的技巧.通常我们会使用Oracle提供的Time Model,比如我们需要作出类似于下面这样的趋势图来展示系统负载的高低. 这样的趋势图可以直接使 ...
- CentOS yum源设定使用方法的整理(转)
CentOS yum更新了很多版本更新,我本人认为CentOS yum很好使的文件系统,在此向大家推荐CentOS应该是做为服务器的linux的佼佼者.CentOS采用的二进制包是rpm,不过包的依赖 ...
- Java 实现 RSA 非对称加密
非对称加密算法:用两个密钥(公钥/私钥)对数据进行加密和解密. 一.原理 非对称加密算法实现机密信息交换的基本过程是: 1)甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开; 2)得到该公用密钥 ...