算法导论笔记:25所有节点对的最短路径问题

       本章考虑在给定的有向加权图G=(V, E),对于所有的节点u,v∈V,找到一条从节点u到节点v的最短路径。希望以表格的形式表示输出:第u行第v列给出的是节点u到节点v的最短路径权重。

       对于这个问题,如果是运行|V|次单源最短路径算法来解决所有节点对的最短路径问题,每一次使用一个不同的节点做为源节点。如果所有边的权值是非负的,可以采用Dijkstra算法。如果采用数组来实现最小优先队列,算法的运行时间为O()=O()。使用二叉堆实现的最小优先队列将使算法的运行时间降低到O(VE lg V),这个时间在稀疏图的情况下有很大改进,因为稀疏图E <。如果采用斐波那契堆来实现最小优先队列,其算法运行时间为O()。

       如果图中有权重为负值的边,就必须采用效率更低的Bellman-Ford算法,这样的运行时间将使O(),在稠密图的情况下,该运行时间为O()。

 

       本章研究的算法将能做到更好,同时,本章还讨论所有节点对最短路径问题与矩阵乘法之间的关系。

       本章的多数算法采用邻接矩阵表示图,假定节点的编号为1,2,...,|V|,因此,算法的输入是n*n的矩阵W,该矩阵代表一个有n个节点的有向图的边的权重:

       算法的输出也是一个n*n的矩阵D = ()。其中 = δ(i, j)。

 

       为了解决所有顶点间最短路径问题,不仅要算出最短路径的权值,而且要计算出一个前驱节点矩阵,其中在i=j或从i到j没有通路时为NIL,其他情况下表示从i到j的某条最短路径上j的前驱顶点。由矩阵的第i行导出的子图应是根节点为i的一棵最短路径树。下面的算法将打印出从节点i到节点j的一条最短路径,该算法类似于22章的PRINT-PATH过程:

PRINT-ALL-PAIRS-SHORTEST-PATH(, i, j)

       if i == j

              print  i

       else  if  == NIL

              print  “no path from i to j exists”

       else  PRINT-ALL-PAIRS-SHORTEST-PATH(, i, )

              print  j

 

       本章使用大写字母表示矩阵,如W, L或D,使用带下标的小写字母表示矩阵中的个体元素,如

 

一:最短路径和矩阵乘法

       本节讨论一种动态规划算法,动态规划算法的步骤是:分析最优解的结构,递归定义最优解的值,自底向上计算最优解的值。

 

      之前讨论单源最短路径问题时,已经证明一条最短路径的所有子路径都是最短路径。考虑从i到j的一条最短路径p,假定p最多包含m条边,假定没有权值为负值的环路,且m为有限值。如果i=j,则p的权重为0且不包含任何边。如果i和j不同,则将p分解为,其中路径p’最多包含m-1条边,所以δ(i, j) =δ(i, k)+

       设为从i到j的最多包含m条边的任意路径中的最小权重。当m=0时,从i到j之间存在一条没有边的最短路径当且仅当i=j。所以:

对于m>0,有 =

       如果i到j之间最短路径,则该路径为简单路径,其中包含的边最多为n-1,所以有:

       对于所有的节点i和j,有 = (),所以, = W。下面的算法假定已经知道了W的情况下,给出如何计算,其中,L表示 L’表示该算法的时间复杂度为O()


      

       现在可以看到上面的算法与矩阵乘法的关系了。假定希望计算矩阵乘积C = A*B,对于i,j=1,2,...,n,有 = 。如果在 = 做出下面的替换:

就可以得到 = 。因此,如果对算法EXTEND-SHORTEST-PATHS做出上面的替换,就可以得到标准的矩阵乘法的算法。

 

       如前所述,矩阵包含的是最短路径权重,所以,下面的算法可以在O()时间内,计算出该矩阵阵列:


 

       我们的目标并不是要计算所有的矩阵,我们感兴趣的仅仅是矩阵。因为有:正如传统的矩阵乘法是相关的,所以由EXTEND-SHORTEST-PATHS过程所定义的算法也是相关的。所以可以采用重复平方的技术计算该矩阵序列,该算法的时间复杂度可以减少为O();


      

二:Floyd-Warshall算法

       Floyd-Warshall算法采用不同的动态规划公式解决所有节点对的最短路径问题,它的运行时间是O(),该算法同样假设:可以存在负权重的边,但不能存在权重为负值的环路。

 

       Floyd-Warshall算法考虑一条最短路径上的中间节点,这里简单路径p=<>上的中间节点指的是路径p上除之外的任意结点。

       假定图G的所有节点V={1,2,...,n},考虑其中的子集{1,2,...,k}。对于任意的结点i,j∈V,考虑从i到j的所有中间节点均取自集合{1,2,...,k}的路径。并设p为其中的最短路径,分两种情况讨论:

       a:如果结点k不是p上的中间节点,则路径p上的所有中间节点都属于集合{1,2,...,k-1}。因此,从i到j的中间节点均取自集合{1,2,...,k}的一条最短路径,同样也是从i到j的中间节点均取自集合{1,2,...,k-1}的一条最短路径。

       b:如果结点k是路径p上的中间节点,则p可以分解为,所以,p1上的所有中间节点都属于集合{1,2,...,k-1},同理p2也是。

      

       根据上面的观察,为从ij的所有中间节点全部取自集合{12...,k}的一条最短路径的权重。当k=0时,i到j的路径没有中间节点,这样的路径最多只有一条边,所以有 = 。根据上面的讨论,可以有:

    

因为对于所有的路径,所有的中间节点都属于集合{1,2,...,n},矩阵=给出的就是最终的矩阵: (i, j)算法如下,该算法的运行时间为O():

       

      

       另外,可以在计算的同时计算前驱矩阵,具体来说,需要计算一个矩阵序列:,这里 =,并且定义 为从ij的一条所有中间节点都取自集合{1,2,...,k}的最短路径上,j的前驱结点。

       所以,可以给出的一个递归公式,当k=0时,从i到j的一条最短路径上没有中间节点,所以:

如果k>1,则有:

,这样,就可以在计算的同时,计算前驱矩阵了,下面是一个运算过程:

 

       给定有向图G=(V, E),结点集合V={1,2,..., n},希望判断对于所有的i和j,图G中是否包含一条从节点i到j的路径,这称为G的传递闭包问题。

 

       一种计算图G的传递闭包的办法是给E中的每条边赋予权重1,然后运行Floyd-Warshall算法,如果存在一条从i到j的路径,则有< n;否则,。这种算法的时间复杂度为O()。

 

       可以有另外一种算法,该算法使用逻辑或操作和逻辑与操作替换Floyd-Warshall算法中的算术操作min和+。对于i,j,k=1,2,...,n,定义:如果图G中存在一条从节点i到结点j的所有中间节点都取自集合{1,2,...,k}的路径,则 = 1,否则, = 0所以,当k=0时,有:

,对于k>=1,有:

 = ,所以算法如下:

       

    该算法从结构上类似于Floyd-Warshall算法,运行时间为O(),但是逻辑运算通常要比算术运算要快,而且TRANSITIVE-CLOSURE所需要的空间更少。

 

三:用于稀疏图的johnson算法

      johnson算法可以在O()时间内找到所有节点对之间的最短路径。对于稀疏图来说,算法在渐近意义上要好于矩阵的重复平方法或Floyd-Warshall算法。算法要么返回一个包含所有节点对的最短路径权重的矩阵,要么报告输人图中存在一个负权值的回路。算法需要使用Dijkstra算法和Bellman-Ford算法作为其子程序。

 

      Johnson算法使用的技术称为重新赋予权重。如果图G=(V, E)中所有的边权重w皆为非负值,则可以采用对每个节点运行Dijkstra算法找到所有节点对的最短路径,如果该图包含权重为负值的边,但没有权重为负值的环路,则只要计算出一组新的非负权重值,然后使用同样的方法即可。新赋予的权重w’必须满足下面的性质:

      a:多于所有顶点对u、v∈V,一条路径p是利用加权函数w时从u到v的一条最短路径,当且仅当p也是利用加权函数w’时从u到v的一条最短路径。

      b:对于所有的边(u, v),新的权重w’(u, v)是非负值。

  

      给定带权重的有向图G=(V, E),其权重函数为w,设h: v->R为任意函数,该函数将节点映射到实数上。对于每条边(u,v),定义w’(u,v)= w(u, v) + h(u) – h(v)设p = <>为从节点到节点的任意一条路径,那么p是在使用权重函数w时从节点到节点的一条最短路径,当且仅当p是在使用权重函数w’时从节点到节点的一条最短路径。即w(p) = δ()当且仅当w’(p) =δ'()而且,图G在使用权重函数w时不包含负值环路,当且仅当G在使用权重函数w’时不包含负值环路。

 

      下一个目标是确保第二个属性成立,也就是所有边(u, v),w’(u,v)>=0。如果给定图G=(V, E),制作一幅新图G’ = (V’, E’)。其中V’ = V∪{s}s是一个新节点。E’ = E {(s,v): v∈V},并且,对于所有节点vV, w(s, v) = 0所以G’不包含权重为负值的环路当且仅当图G不包含权重为负值的环路。现在定义函数h,对于所有节点v∈V’,h(v) =(s)。所以w’(u, v) = w(u, v)+ h(u) – h(v)。根据三角不等式定理,可以得到w’(u, v)>=0

 

      Johnson算法执行过程中需要使用Bellman-ford算法和Dijkstra算法。该算法假定所有的边都保存在邻接链表里,返回一个|V|*|V|的矩阵D = ,其中 =δ(i, j)。

 

      

      如果使用斐波那契堆来实现Dijkstra算法,则Johnson算法的运行时间为O(),使用更简单的二叉堆实现,则时间为O(VE lg V),在稀疏图的情况下,仍然比Floyd-warshall算法快。

 

转载于:https://www.cnblogs.com/gqtcgq/p/7247220.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS开发~UI布局(二)storyboard中autolayout和size class的使用详解

一、概要&#xff1a;前一篇初步的描述了size class的概念&#xff0c;那么实际中如何使用呢&#xff0c;下面两个问题是我们一定会遇到的&#xff1a;1、Xcode6中增加了size class&#xff0c;在storyboard中如何使用&#xff1f; 2、auto layout该如何与size class配合来进行…

Linux:守护进程解析、如何实现守护进程

1、守护进程&#xff1a; 守护进程也称精灵进程&#xff08;Daemon&#xff09;&#xff0c;是运行在后台的⼀一种特殊进程。它独立于控制终端且周期性地执行某种任务或等待处理某些发生的事件。守护进程是⼀一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如…

CAS实现单点登录方案(SSO完整版)

一、简介 1、cas是由耶鲁大学研发的单点登录服务器 2、本教材所用环境 Tomcat7.2JDK1.7CAS Service 版本 cas-server-3.4.8-releaseCAS Client版本 cas-client-3.2.1-release 二、生成证书 证书对于实现此单点登录非常之重要&#xff0…

PHP、C#、通用的DES加密

2019独角兽企业重金招聘Python工程师标准>>> PHP class JoDES {private static $_instance NULL;/*** return JoDES*/public static function share() {if (is_null(self::$_instance)) {self::$_instance new JoDES();}return self::$_instance;}/*** 加密* para…

如何防止头文件被重复包含或引用?

一、#pragma once ( 比较常用&#xff09; 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次&#xff0c;这条指令实际上在VC6中就已经有了&#xff0c;但是考虑到兼容性并没有太多的使用。 #pragmaonce是编译相关&#xff0c;就是说这个编译系统上能用&#xff…

如何解决类模板的分离编译问题?

一模板&#xff1a; 模板不是数据类型&#xff0c;只能算是一种行为集合的表示。编译器在使用模板时&#xff0c;通过更换模板参数来创建数据类型。这个过程就是模板实例化(Instantiation)&#xff0c; 从模板类创建得到的类型称之为特例(specialization)&#xff0c;说白了就是…

结对项目 刘静 201303014059 计科高职13-2

结对&#xff1a;人&#xff1a;孙帅 博客地址&#xff1a; http://www.cnblogs.com/s3366181/p/4509260.html一、 题目简介 1.所选题目&#xff1a;输出圆的面积 2.编程工具&#xff1a;Eclipse 3、实现功能&#xff1a;用户给定一圆的半径运行程序系统会给出给定半径圆的面…

弹出div或者弹出新窗口的固定位置、固定大小

2019独角兽企业重金招聘Python工程师标准>>> js代码&#xff1a; //打开一个新窗口&#xff0c;固定的位置&#xff0c;固定的大小 //window.open("push_add.html",newwindow, height550, width1000, top200, left500, toolbarno, menubarno, scro…

NAT(网络地址转换)技术与代理服务器原理

一、 Nat技术&#xff1a; NAT英文全称是“Network Address Translation”&#xff0c;中文意思是“网络地址转换”&#xff0c;它是一个IETF(Internet Engineering Task Force,Internet工程任务组)标准&#xff0c;允许一个整体机构以一个公用IP&#xff08;Internet Prot…

原 Linux搭建SVN 服务器2

原 Linux搭建SVN 服务器 发表于1年前(2014-08-05 17:55) 阅读&#xff08;12257&#xff09; | 评论&#xff08;3&#xff09; 31人收藏此文章, 我要收藏赞3摘要 Linux搭建SVN 服务器目录[-] Linux搭建SVN 服务器1 安装SVN2 使用客户端连接2.1 使用…

网络层核心:路由和路由生成算法

一、路由和路由算法简介&#xff1a; 路由就是通过互连的网络把信息从源地址传送到目的地址的活动。路由发生在OSI网络参考模型的第三层即网络层。 路由引导封包转送&#xff0c;经过一些中间的节点后&#xff0c;到达目的地。把该功能做成硬件的话称为路由器。路由通常根据路…

网络:常见的端口号及分类

一、端口号概念 在网络技术中&#xff0c;端口&#xff08;Port&#xff09;包括逻辑端口和物理端口两种类型。物理端口指的是物理存在的端口&#xff0c;如ADSL Modem、集线器、交换机、路由器上用 于连接其他网络设备的接口&#xff0c; 如RJ-45端口、SC端口等等。逻辑端口…

EditPlus 技巧大全:[1]怎么配置PHP编译环境

editplus是一款小巧但功能强大易扩展的文本编辑器&#xff0c;可以通过设置用户工具将其作为C,Java,Php等等语言的一个简单的IDE。 工具/原料 EditPlus v3.3.1 php 5.3.14 方法/步骤 1.打开editplus 2.点击菜单栏“工具” 3.选择下拉菜单的“配置用户工具”&#xff0c;进入配置…

网络:传输层 TCP报文格式解析

一、TCP报文格式 1、为了提供可靠的数据传输&#xff0c;TCP报文首部字段有较多的字段&#xff0c;TCP报文格式如下图&#xff1a; 图2 TCP报文格式 16位源和目标端口&#xff08;16位&#xff09;&#xff1a;用于多路复用/多路分解来自或送至上层应用的数据&#xff0c;可以…

MATLAB图像小波变换

为什么80%的码农都做不了架构师&#xff1f;>>> 小波变换与小波包变换 人脸图像f(x,y) 的一层小波变换如下图所示&#xff1a; 图中L 和H 分别表示低通滤波器和高通滤波器&#xff0c;l(n) 和h(n) 分别表示它们相应的脉冲响应&#xff0c;2↓1表示降2采样fLL和fHH分…

grunt之Gruntfile(1)

grunt 执行的时候&#xff0c;他会找该目录下的Gruntfile文件&#xff0c;所以&#xff0c;要在目录下创建Gruntfile文件。 下面我demo一个copy任务&#xff1a; 执行copy&#xff0c;首先我们要一个copy的模块&#xff0c;那么我们先安装下copy模块 首先&#xff0c;我到H盘&a…

MyEclipse从数据库反向生成实体类之Hibernate方式 反向工程

2019独角兽企业重金招聘Python工程师标准>>> 开发项目涉及到的表太多&#xff0c;一个一个的写JAVA实体类很是费事。MyEclipse提供简便的方法&#xff1a;反向数据库 步骤大致如下: 第一步&#xff1a; window-->open Perspective-->MyEclipse Java Persisten…

开始nodejs+express的学习+实践(8)

为什么80%的码农都做不了架构师&#xff1f;>>> 1.session使用 介绍的非常详细&#xff1a; http://www.cnblogs.com/chenchenluo/p/4197181.html 对比我们的app.js需要引入express-session模块和使用这个模块&#xff0c;在package依赖&#xff0c;并加载。 我们修…

maven项目部署到linux上的奇葩问题

2019独角兽企业重金招聘Python工程师标准>>> 经常会遇到这样子的问题&#xff0c;maven项目在本地的eclipse配置的好好的&#xff0c;结果一到服务器就运行不起来。 当然遇到这种情况&#xff0c;我们首先会想到环境变量和相关的路径问题&#xff0c;但是当这两个条…

网络:TCP通讯之 time_wait 状态

基于TCP协议的通讯流程1、TCP建立连接2、TCP断开连接3、TCP状态转换TCP状态解释&#xff1a; SYN-RECVD&#xff1a;再收到和发送一个连接请求后等待对方对连接请求的确认 ESTABLISHED&#xff1a;代表一个打开的连接 FIN-WAIT-1&#xff1a;等待远程TCP连接中断请求&#xff0…