说明:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. python学习-7 条件语句 while循环 + 练习题

    1.死循环 while 1 == 1: print('ok') 结果是一直循环 2.循环 count = 0 while count < 10: print(count) count = cou ...

  2. mysqldump原理及实战

    使用mysqldump命令行工具创建逻辑备份: 注意mysqldump的版本和路径mysqldump命令创建的是逻辑备份,结果集有两种格式:一种是将数据转换成标准的SQL语句(一堆CREATE,DRO ...

  3. 9.ssh登录慢

    修改方式:使用root权限修改ssh的配置文件,vim /etc/ssh/sshd_config增加一行记录:UseDNS no修改GSSAPIAuthentication参数为 no,默认是yesP ...

  4. 【数据结构】P1449 后缀表达式

    [题目链接] https://www.luogu.org/problem/P1449 [题目描述] 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符 ...

  5. ACCESS打得开mdb,但打不开表,弹框提示未知错误。

    我的电脑有个一个奇怪的错误ACCESS能打开mdb数据库,但是打不开表,一打开就提示错误,只有俩字“未知”.重装OFFICE也不行!而且电脑上使用Access数据库的应用软件都不行了!都提示“未知”错 ...

  6. STM32 USB Virtual COM

    STM32 USB Virtual COM USB转串口的功能实现   这次讲的是如何实现USB转串口功能的实现.首先看看工程的布局吧: 我们主要要介绍的文件的在USB_User这个组文件.从上面的截 ...

  7. 8.SpringMVC注解式开发-HelloWorld

    第一个注解式开发程序 SpringMVC 是 Spring 框架的一部分,所以它和Spring结合的是非常紧密的 使用 @Controller 注解,既可以将处理器交给Spring容器去管理,又可以说 ...

  8. 【python】多进程、多线程、序列

    一.多进程 1.子进程永远返回0,而父进程返回子进程的ID.这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程 ...

  9. How to Change the Default Theme Appearance [editing with no theme]

    Windows Live Writer has the ability to allow users to see their blog as it'd be posted as they are c ...

  10. Java中的集合(上):概述、Collection集合、List集合及其子类

    一.集合的体系结构 二.Collection集合 1.基本使用 如下代码 import java.util.ArrayList; import java.util.Collection; public ...