说明:

本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节
本人算法菜鸟一枚,提供的证明仅是自己的思路,不保证正确,仅供参考,若有错误,欢迎拍砖指正
 
-------------------------------------------
 
Dijkstra算法和Floyd算法用于求解连通图中任意两个顶点之间的最短路径
 
Dijksra算法从一个顶点v0出发,每次为一个顶点vi确定到达v0的最小路径
 
Dijkstra算法用distance[i]记录顶点vi到v0的最短路径,用path[i]记录在最短路径中vi顶点的前继顶点,另外再用found[i]来标志顶点vi的最短路径是否已经确定
 

distance[]初始化为v0在邻接矩阵中的对应行,distance[i]记录了 以目前已经探明最小路径的顶点(以下简称已定顶点)(包括v0)为前继顶点 的所有路径中最短的路径长

Dijkstra算法做出了这样一个判断:每次从尚未确定最小路径的顶点中(一下简称 未定顶点)挑选一个distance值最小的顶点vj,则该顶点对应的distance[j]必定是vj的真实的最小路径长度,下面证明这个判断:
 
对于任意一个未定顶点,其最小路径中必定至少包含一个已定顶点(至少会包含v0),则该路径中至少有一个未定顶点vm以一个已定顶点vn为前继顶点,而length(v0-vn-vm) >= diatance[m] >= distance[j],也就说任意一个未定顶点的最小路径长必定不小于distance[j],由此就可以确定distance[j]必定是vj真实的最小路径长
 
Dijkstra算法的复杂度是n^2,每次确定一个顶点的最短路径,而确定一个顶点的最短路径需要遍历并比较distance数组,并且确定之后需要遍历更新distance数组,所以是n*n的开销
 
--------------------------------
 
Floyd算法的执行逻辑甚为简单,包含了三个循环的嵌套;其思路是遍历图中的每一个点,针对这个点vm,遍历图中任意两个顶点的两两组合vi和vj,比较vi和vj当前的最短连接和通过vm的连接的大小,并且把新的当前最短连接重置为其中更小的那个值;这样一圈遍历下来,就可以保证得到图中任意两个顶点之间的最小距离
 
这看起来并不靠谱,因为在最初vi和vm、vj和vm之间的最小路径都尚未安全确定下来的时候,如何能够马上就拿来比较,这时的比较不应该是无效的吗?
 
但是事实上并不需要每一步都实现严格的有效的比较,因为全部遍历下来之后,肯定会发生一次有效的比较
 
下面给出证明:
假设vi、vj之间的最小路径一共包括x个其它顶点,显然这条路径也确定了其中任何两个顶点之间的最小路径,否则比如vm、vn之间有不属于当前路径的最小子路径,则用该子路径替代当前的子路径,就可以得到更小的vi、vj之间的最小路径
 
对于这条路径上的任意三个相邻(至少会有一组相邻三顶点)顶点vm1、vm2、vm3,当遍历到vm2时,显然此时vm1-vm2-vm3这条最小子路径就会被连接起来(因为这条路径必定是vm1到vm3的最小子路径);事实上,当遍历到这条最小路径上的任意一个顶点的时候(除了vi、vj),就会把相邻的两个顶点连接起来;当所有顶点都被遍历之后,这x个顶点也必定已经把其在最小路径上相邻的顶点全都连接完毕,包括分别在两端的vi和vj顶点;换句话说,vi和vj之间的最小子路径必定已经被找到
 
Floyd算法的复杂度为n^3

Dijkstra算法和Floyd算法的正确性证明的更多相关文章

  1. 【转载】Dijkstra算法和Floyd算法的正确性证明

      说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的证明仅是自己的思路,不保证正确,仅供参考,若有错误,欢迎拍砖指正   ----------- ...

  2. 最短路径——Dijkstra算法和Floyd算法

    Dijkstra算法概述 Dijkstra算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图(无 ...

  3. 最短路径Dijkstra算法和Floyd算法整理、

    转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijks ...

  4. 【转】最短路径——Dijkstra算法和Floyd算法

    [转]最短路径--Dijkstra算法和Floyd算法 标签(空格分隔): 算法 本文是转载,原文在:最短路径-Dijkstra算法和Floyd算法 注意:以下代码 只是描述思路,没有测试过!! Di ...

  5. 最短路径—Dijkstra算法和Floyd算法

    原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...

  6. 最短路径—大话Dijkstra算法和Floyd算法

    Dijkstra算法 算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , ...

  7. 最短路径—Dijkstra算法和Floyd算法【转】

    本文来自博客园的文章:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算法 1.定义概览 Dijk ...

  8. 图的最短路径——dijkstra算法和Floyd算法

    dijkstra算法 求某一顶点到其它各个顶点的最短路径:已知某一顶点v0,求它顶点到其它顶点的最短路径,该算法按照最短路径递增的顺序产生一点到其余各顶点的所有最短路径. 对于图G={V,{E}};将 ...

  9. 【转载】最短路径—Dijkstra算法和Floyd算法

    注意:以下代码 只是描述思路,没有测试过!! Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始 ...

随机推荐

  1. centos 秘钥登录

    客户端系统:macOS 服务端系统:Centos7 另外:ip 为 172.25.11.182 用户名为 iamfine 1, 在客户端macOS上生成 rsa 对 ssh-keygen -t rsa ...

  2. 基于全备份+binlog方式恢复数据

    基于全备份+binlog方式恢复数据 将bkxt从库的全备份在rescs5上恢复一份,用cmdb操作 恢复全备后执行如下操作 set global read_only=OFF; stop slave; ...

  3. PostgreSQL查看表、表索引、视图、表结构以及参数设置

    -- 表索引select * from pg_indexes where tablename='person_wechat_label';select * from pg_statio_all_ind ...

  4. 论文笔记-IGCV3:Interleaved Low-Rank Group Convolutions for Efficient Deep Neural Networks

    论文笔记-IGCV3:Interleaved Low-Rank Group Convolutions for Efficient Deep Neural Networks 2018年07月11日 14 ...

  5. 修改hosts文件 解决coursera可以登录但无法播放视频的问题

    我们经常为了学习或者了解一些领域的知识为访问国外的网站,但是在国内,很多优秀的网站都被封锁了.在GFW(墙)的几种封锁方式中,有一种就是DNS污染,GFW会对域名解析过程进行干扰,使得某些被干扰的域名 ...

  6. React高阶组件学习笔记

    高阶函数的基本概念: 函数可以作为参数被传递,函数可以作为函数值输出. 高阶组件基本概念: 高阶组件就说接受一个组件作为参数,并返回一个新组件的函数. 为什么需要高阶组件 多个组件都需要某个相同的功能 ...

  7. (一)初识JavaFX

    JavaFX是一个强大的图形和多媒体处理工具包集合,它允许开发者来设计.创建.测试.调试和部署富客户端程序,并且和Java一样跨平台. JavaFX应用程序 由于JavaFX库被写成了Java API ...

  8. babel详解

    https://segmentfault.com/a/1190000019718925 https://babeljs.io/blog/2019/03/19/7.4.0#core-js-3-7646- ...

  9. 1 设置 dev express控件RepositoryItemLookUpEdit数据源的方法

    private void SetLookUpEditData(Type enumType, DevExpress.XtraEditors.Repository.RepositoryItemLookUp ...

  10. 2.vi 和 vim 编辑器

    Linux系统的命令行下的文本编辑器 三种模式 一般模式:打开文档的默认模式 编辑模式 可以进行编辑,要按下  i  a  o  r 等字母后才能从一般模式进入编辑模式 按下ESC 退出编辑模式 命令 ...