说明:

本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节
本人算法菜鸟一枚,提供的证明仅是自己的思路,不保证正确,仅供参考,若有错误,欢迎拍砖指正
 
-------------------------------------------
 
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. Elastic Search的聚合搜索

    就是使用ES提供的aggs语法结果,使用DSL搜索的语法,实现聚合数据的统计,查询.ES中,如果新增document数据的时候,对应的index和type不存在,则自动创建. 1 准备源数据 PUT ...

  2. pb datawindow 类型

    DataWindow.Processing 判断 DataWindow 对象的类型 可用 DataWindow.Processing 判断 DataWindow 对象的类型,dw的类型如下:     ...

  3. date和time

    time和date两个函数在Lua中实现所有的时钟查询功能.函数time在没有参数时返回当前时钟的数值. t=os.date()print(t) 05/07/19 16:49:18 --------- ...

  4. 查询进程内存,cpu占用情况。僵尸进程

    查使用内存最多的5个进程:ps aux | head -1 && ps aux | grep -v USER | sort -nr -k 4 | head -5 查使用CPU最多的5个 ...

  5. NET Core:搭建私有Nuget服务器以及打包发布Nuget包

    docker 安装 https://www.cnblogs.com/liuxiaoji/p/11014329.html 1.使用docker搭建私有Nuget服务器 docker run -d -p ...

  6. SQL SERVER 相关

    while循环 declare @sum int; declare @i int; ; ; ) begin ) begin set @sum=@sum+@i; end ; end select @su ...

  7. dev grid的一些使用

    保留选中数据,其他数据删除,不操作数据库 private void butnoremove_Click(object sender, EventArgs e) { int iSelectRowCoun ...

  8. bash 中 () {} [] [[]] (()) 的解释

    bash 中 () {} [] [[]] (()) 的解释 来源  https://www.cnblogs.com/fhefh/archive/2011/04/16/2017895.html bash ...

  9. Func<>委托、扩展方法、yield、linq ForEach综合运用

    1.先定义一个Model类    public class P1    {        public string name { get; set; }        public int age ...

  10. centos7安装配置zabbix监控

    CentOs7安装部署Zabbix3.4 1.关闭selinux和firewall systemctl  stop  firewalld setenforce 1.1检测selinux是否关闭 [ro ...