说明:

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

    软件介绍 在我们平时开发中,特别是需要与接口打交道时,无论是写接口还是用接口,拿到接口后肯定都得提前测试一下,这样的话就非常需要有一个比较给力的Http请求模拟工具,现在流行的这种工具也挺多的,像火狐 ...

  2. python — 表的操作(一)

    1. 创建表 创建表: create table t1 (id int,name char(4)); create table t2 (id int,name char(4)) engine=myis ...

  3. global和nonlocal的区别

    global可以在任何地方修饰变量,而且被global修饰的变量直接被标识为全局变量,对该变量修改会影响全局变量的值,但不影响函数中未被global修饰的同名变量(依然是局部变量),nonlocal只 ...

  4. java-filter and listener

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 使用 Serv ...

  5. Spring ——获取IOC容器时,构造方法、set方法、类方法执行顺序

    1,首先,我们在ApplicationContext.xml中会写下下面类的标示: <bean id="helloword" class="com.xt.frist ...

  6. MVC和WebApi中设置Area中的页为首页

    拿WebApi为例,我们一般会生成一份帮助文档,帮助文档会在Area中 我们现在要讲帮助文档设为首页 只需在App_Start文件夹下添加 RouteConfig 类 public class Rou ...

  7. linux pthread多线程编程模板

    pthread_create() 创建线程,pthread_join()让线程一直运行下去. 链接时要加上-lpthread选项. pthread_create中, 第三个参数为线程函数,定义如下: ...

  8. gogs 搭建

    sudo apt-get install nginx sudo apt-get install git sudo apt-get install mysql-server mysql -u root ...

  9. LeetCode 腾讯精选50题--合并K个排序链表

    今天的题目稍微有点复杂了,因为是K个有序链表的合并,看到这道题后的大体思路是这样的: 1.首先先做到两个链表的合并,链表的合并我想到的是用递归操作, 2.其次是多个链表的合并,所以在第一步实现的基础上 ...

  10. 使用webform、websevice来进行ajax请求操作

    通过使用webform(asp.net非mvc) .webservice 作为请求接口在前台发送ajax请求:1.前台代码: $.ajax({ type: "POST", //方法 ...