有关Floyd相关算法的一点点改进
2015-01-20 16:40
281 查看
今天看到了华山大师兄的博客中的Floyd算法,自己用java动手写了一个,发现存在一些问题,特此在这里写出来,跟大家分享一下:
java代码:
i==j时:出发点和目标点相同,肯定为0,所以不用计算
k==i时:出发点和中间点相同,没必要计算
来写的话,如果A[i][k]或者A[k][j]其中之一为不可达到的点就会溢出,他俩的和会变成一个负数(具体为什么可以看看其他相关资料)从而导致了算法的失败,因此,需要先计算两个的差值,然后再比较大小,这样数值就不会溢出,从而完成算法。
答案是不行。
因为如果A[i][j]为可达,而A[i][k]和A[k][j]都不可达,那么就会造成负数的溢出,还是会影响到算数结果(大家如果有不明白,可以看看整数如何存储在电脑上,相加/相减为什么有时候结果会不对相关的资料)
这些也都是我自己总结出来的,如有不对希望大家批评指点!
java代码:
public static final int UNREACH = Integer.MAX_VALUE;//设置不可到达点权值 public static void main(String[] args) { // 邻接矩阵 int[][] A = { { 0, 5, UNREACH, 7 }, { UNREACH, 0, 4, 2 }, { 3, 3, 0, 2 }, { UNREACH, UNREACH, 1, 0 } }; for (int k = 0; k < A.length; k++) { // 行计算: for (int i = 0; i < A.length; i++) { for (int j = 0; j < A.length; j++) { // 源代码: // if (A[i][j] > A[i][k] + A[k][j]) { // 修改以后的代码 if (i != j && i != k && A[i][j] - A[i][k] > A[k][j]) { A[i][j] = A[i][k] + A[k][j]; } } } } }
1.i!=j&&i!=k
这部分代码是为了减少不必要的计算:i==j时:出发点和目标点相同,肯定为0,所以不用计算
k==i时:出发点和中间点相同,没必要计算
2. A[i][j] - A[i][k] > A[k][j]
首先需要注意的是,我在这里将不可达到的点的权值设置为了Integer.MAX_VALUE,那就是有符号整数的最大值,这时如果还是按照原作者的代码:if (A[i][j] > A[i][k] + A[k][j])
来写的话,如果A[i][k]或者A[k][j]其中之一为不可达到的点就会溢出,他俩的和会变成一个负数(具体为什么可以看看其他相关资料)从而导致了算法的失败,因此,需要先计算两个的差值,然后再比较大小,这样数值就不会溢出,从而完成算法。
3.注:
如果有朋友想到:那我写成:if(A[i][j] - A[i][k] - A[k][j]>0)是否可以呢?
答案是不行。
因为如果A[i][j]为可达,而A[i][k]和A[k][j]都不可达,那么就会造成负数的溢出,还是会影响到算数结果(大家如果有不明白,可以看看整数如何存储在电脑上,相加/相减为什么有时候结果会不对相关的资料)
这些也都是我自己总结出来的,如有不对希望大家批评指点!
相关文章推荐
- 经典RANSAC以及其相关的改进的算法小结
- 顾广华白细胞图像的自动分割算法的相关改进
- 利用"线段树"相关算法解决有关数组的问题[待续]
- Linux在嵌入式系统中有关进程调度算法的实时性改进
- 有关UNICODE、ANSI字符集和相关字符串操作的总结
- kmp改进算法
- 有关电脑填彩票的小算法--给定数列,输出其随机数列
- 冒泡排序的算法分析与改进 (选择自 Uncommon 的 Blog )
- 冒泡排序的算法分析与改进
- 冒泡排序的算法分析与改进(转载)
- 求公共子串问题以及其改进算法
- 【原创】朴素的模式匹配和改进的模式匹配(KMP)算法说明(草稿)
- 有关base64编码算法的相关操作
- 介绍有关学习C++ STL的预备知识和STL的相关背景知识,适合想对STL做大致了解的初学者
- [转]有关UNICODE、ANSI字符集和相关字符串操作的总结!
- 求公共子串问题以及其改进算法
- 分组密码算法分析,改进
- 2005/2/21 开始查阅有关gis的相关信息
- LCS 算法的改进
- 与算法相关的几个术语(信息 数据 编程语言)