关于floyd-warshall算法的一个疑问
时间:2011-11-03
来源:互联网
按照《算法导论》上的递归公式,令dij(k)为从顶点i到顶点j,且满足所有中间顶点皆属于集合{1,2,…,k}的一条最短路径的权值。当k=0时,表示i和j之间的路径上没有编号大于0的中间节点,即不存在中间节点。所以dij(0) = wij.根据以上讨论,递归式如下:
wij k=0
dij(k) = {
min( dij(k-1), dik(k-1)+dkj(k-1) ) k>=1
我的疑问如下:
以计算dij(4)为例,假设我们已经计算完了d4 2(2)且d4 2(2)不同于d4 2(1),那么在计算d4 3(2)时,我们会用到d4 2(1)和d2 2(1),但是此时d4 2 (1)已经被更新成d4 2(2)了,我们在实现的时候是不是应该保存d4 2(1)呢?
但是在《算法导论》给出的实现里面(P387)并没有在计算dij(k)前保存dij(k-1)。
我的意思是计算dij(k)时要用到dik(k-1)和dkj(k-1),但是dik(k-1)、dkj(k-1)可能在之前计算的时候已经被更新成dik(k)和dkj(k)了。那么我们实现的时候应该在计算dij(k)前先保存dij(k-1),否则程序就是错的了,至少没有按照之前定义的递归式进行计算。
我想我应该表述的比较清晰了,请大家帮忙看一看,谢了。
d4 2 (2)表示从顶点4到顶点2的且中间节点属于{1,2}的一条最短路径,其余类推。
wij k=0
dij(k) = {
min( dij(k-1), dik(k-1)+dkj(k-1) ) k>=1
我的疑问如下:
以计算dij(4)为例,假设我们已经计算完了d4 2(2)且d4 2(2)不同于d4 2(1),那么在计算d4 3(2)时,我们会用到d4 2(1)和d2 2(1),但是此时d4 2 (1)已经被更新成d4 2(2)了,我们在实现的时候是不是应该保存d4 2(1)呢?
但是在《算法导论》给出的实现里面(P387)并没有在计算dij(k)前保存dij(k-1)。
我的意思是计算dij(k)时要用到dik(k-1)和dkj(k-1),但是dik(k-1)、dkj(k-1)可能在之前计算的时候已经被更新成dik(k)和dkj(k)了。那么我们实现的时候应该在计算dij(k)前先保存dij(k-1),否则程序就是错的了,至少没有按照之前定义的递归式进行计算。
我想我应该表述的比较清晰了,请大家帮忙看一看,谢了。
d4 2 (2)表示从顶点4到顶点2的且中间节点属于{1,2}的一条最短路径,其余类推。
作者: march_on 发布时间: 2011-11-03
保存k-1这个数组的话那就是3次方的空间4次方的时间了。我们平时的2次方空间3次方时间的写法是用了这个递推式但不是严格采用递推式的递推顺序。在3次方时间的写法下,最外层的for(k=0;k<n;k++)以后d[i][j]存储的是i->j经过0,1,...,k中间节点的最短路径,而不是长度为k的最短路径。
作者: FancyMouse 发布时间: 2011-11-03
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28