博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
floyed算法的一些感想
阅读量:5738 次
发布时间:2019-06-18

本文共 894 字,大约阅读时间需要 2 分钟。

for(int k=1;k<=n;k++)

         for(int i=1;i<=n;i++)

                   for(int j=1;j<=k;j++)

                            if(f[i][k]+f[k][j]<f[i][j])

                                     f[i][j]=f[i][k]+f[k][j];

以上为floyed的基础模板。Floyed算法,用来计算这个图上任意点对间的距离,3重循环,简单思考便知道,k表示要i - k和k - j去尝试更新i – j。

Floyed算法最神奇的地方在于k循环的位置,为什么要放在最外层而不是最内层,简单思索后,放在最外层是用k点一次更新所有点的距离,而放在最内层则是将i—j的距离尝试用所有点k去更新,乍一看似乎没有什么区别?好像是一样的,但是我们实际手动推算就会发现,没有这么简单!(没错就是手推,虽然暴力,但是极其有效。)

我们来想想这有什么区别先:

         外层:用k更新所有i—j

         内层:枚举所有k来更新i—j

区别就在于这两种更新方式的顺序变了,那么放在内层会产生如何影响呢?

for(int i=1;i<=n;i++)

         for(int j=1;j<=k;j++)

                   for(int k=1;k<=n;k++)

                            if(f[i][k]+f[k][j]<f[i][j])

                                     f[i][j]=f[i][k]+f[k][j];

如果k层在最内层,就是每次更新i—j时都要枚举一遍k点,但实际上,i—k却没有更新过,所以导致i—j无法更新,然后就会产生恶性循环,然后boom的炸掉,到最后也许只有几个幸运点对成功更新出正确距离

但是在外层呢?我们不得不赞叹floyed算法的强大与神奇,因为k点一次更新了所有的点对,所以在进行后续更新操作时,i—k的距离是肯定被更新过了的,保证了算法的正确性,感觉之所以说floyed用到了动态规划思想的原因实际是下一个i—j中,距离是否被更新,只与与j直接相连的k点的所记录的值,即i—k和k—j这个定值有关。

这里就是DP所谓的阶段的问题了,floyed算法更多的还是DP的思想。

 

转载于:https://www.cnblogs.com/ywjblog/p/8547493.html

你可能感兴趣的文章
python魔法函数(二)之__getitem__、__len__、__iter__
查看>>
EL表达式无法显示Model中的数据
查看>>
ps6-工具的基础使用
查看>>
灵活运用 SQL SERVER FOR XML PATH
查看>>
es 加磁盘扩容
查看>>
使用Azcopy在Azure上进行HBase的冷热备份还原
查看>>
linux下使用过的命令总结(未整理完)
查看>>
ES6的一些文章
查看>>
LeetCode 198, 213 House Robber
查看>>
New Year Permutation(Floyd+并查集)
查看>>
<context:component-scan>详解
查看>>
DS博客作业07--查找
查看>>
Git 方法
查看>>
[Python] numpy.nonzero
查看>>
2016-11-29
查看>>
C#反射的坑
查看>>
css3 box-shadow阴影(外阴影与外发光)讲解
查看>>
时间助理 时之助
查看>>
nginx快速安装
查看>>
自定义转场动画
查看>>