Warshall算法(未完成版4.6)

原文来自离散数学结构课本, 作业是要翻译这段, 想着保留下来.
目前(4.6)只是将word上的复制过来而已, 日后有时间弄成标准的markdown形式

定理2:

A是一个基数为n的集合,R是A上的一个关系,则有 R=RR2R3Rn
.
换句话说,计算不需要用到R的n次以上的幂。

证明:

a,b是A中的元素,假设是R中一条从a到b的路,那么都在R中。如果和是同一个顶点,约定j > i,那么这段路能被划分为三个部分。第一段从a到,第二段从到,第三段从到b。中间的第二段是个循环,因为,所以我们除去重复然后连接前后两段。这样我们就得到一条更短的,从a到b的路。(图4.43)

现在是a到b最短的路。如果,那么都是不同的顶点。否则,根据先前的讨论,我们能找到一条更短的路。因此,这条路的长度最多为(因为的基数为)。如果,相似地,顶点是不同的,所以这条路的长度最多为。总之,如果,那么只要。因此.
例1用的方法都有明显的缺点。画图的方法对于巨大的集合不适用,它本身也不是系统化的方法。矩阵的方法是通用的且系统化得足以应用于计算机编程,但是对于庞大的矩阵,它就显得效率低下、过于浪费资源。幸运的是,有一个更加高效地计算传递闭包的算法。就是被熟知的沃夏尔算法,我们马上会讲到。

沃夏尔算法

设集合,是上的关系。如果是中的路,那么任意除了和都叫作路的内部点。现在,对于,我们用以下方法定义一个布尔矩阵。当到之间存在一条路,其内部点来自集合,那么的第i行第j列位置为1。
因为任意的顶点一定在集合中,它所代表的矩阵某个位置为1,当且仅当与之间有路。也就是说,。如果我们定义,那么我们就得到一个数列,。我们会展示怎么从计算得到。这样我们就能从一步一步,经过n步计算得到。这个过程被称为沃夏尔算法。和的幂级是不一样的,这种不同使得它能大量节省计算的传递闭包的步骤。
假设和。如果,就说明与有路,而且这条路只经过一些在集合的顶点。如果没有经过,那么肯定经过了集合中的点,即。如果经过了,那么情况就像图4.44所展示的那样。在定理2的证明中,我们假定了内部点都是互异的。因此只会在路中出现一次,所以子路1和子路2的点必然来自集合。这意味着和。
综上,只要
(1) 或者
(2)

这就是沃夏尔算法的基本内容。如果的i,j位置为1,根据(1),对应位置也为1。根据(2),如果的i,k位置为1,且k,j位置也为1,那么的i,j位置就为1。根据以下过程我们就能从计算出。
第一步 转移所有1到。
第二步 列出中第k行中为1的列数,第k列为1的行数
第三部 将中,位置设为1。
例二 思考定义在例一的关系R,那么

和n=4
第一步我们要计算那么。在2,1位置和1,2位置都为1,因此只是在基础上,在2,2位置变为1。

现在我们计算,那么,我们必须考虑第2列和第二行的位置。在位置1,2;2,2;2,1;2,3都为1。
因此,为了得到,我们必须在的基础上将1,1;1,2;1,3;2,1;2,2;2,3位置置为1。我们看到

继续这个过程,在位置1,3;2,3;3,4为1。为了得到,我们要将1,4;2,4置为1。那么

最后,第4列的1,2,3位置为1,不过没有1在第4行,所以没有新的位置被置为1,那么,我们就得到了例一的结果。
例二说明的过程产生了一下的算法CLOSURE来计算基于矩阵关系R的传递闭包。

算法 沃夏尔

这个算法是被建立在精确的执行出我们先前写出来的过程。如果稍作修改,它能稍微提高一点效率。如果我们认为赋值和比较是一步完成的,那么两个布尔矩阵A、B的布尔积需要步,因为我们要计算个元素,每个需要n次比较。去计算全部的积,我们需要步,因为需要步来计算矩阵乘积。如果直接用公式

会需要步来实现(忽略最终连接)。因此沃夏尔算法是对于直接用公式(1)计算的重大改进。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值