在很多算法之中要对一些变量设置无穷大来表示特殊的含义或者进行特殊的计算,而一些高级编程语言之中往往会为编程者设置一些属性来表示无穷大,例如JAVA中的Integer.MAX_VALUE,这个属性的实际值就是大家都经常爱使用的0x7fffffff(2147483647)。使用这种语言本身的来进行无穷大设置在一些比较操作中看似简单便捷,但是在一些涉及到计算的操作中往往存在数值溢出的危险。通过一段代码来对这种数值的溢出做一定的认识:
public static void main(String[] args)
{
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MAX_VALUE+1);
System.out.println(Integer.MAX_VALUE+2);
System.out.println(Integer.MAX_VALUE+3);
}
当运算数值超出最大值发生数值溢出时,整个变量的数值将从最大值变为最小值之后再进行运算,而如此巨大的数值改变则有可能导致整个算法的运行失败。例如迪杰斯特拉算法中的松弛操作(if(d[j]+cost[j][i]<d[i])),在最短路的更新过程之中,如果某条路径不存在,那么cost[j][i]即为无穷大,但是当其加上前面的d[j]之后就会出现上述的数值溢出的问题,从而导致后续所有的路径更新出现问题。
那么解决这种问题的办法无疑就是将无穷大的赋值进行缩减,那么缩减为多少合适呢?实际上在一般的运算之中,只需要将无穷大缩减为0x3f3f3f3f即可。转化为十进制来看,0x3f3f3f3f是1061109567,和语言所设定的最大值2147483647均为10^9级别的,从数值上来看足够大,一般很少有数字可以超过10^9,并且就算直接使用最大值进行计算操作也不会发生数值溢出的错误,并且就算是使用两个无穷大相加结果是2122219134,也小于2147483647,所以综上所述,以后在进行无穷大赋值的时候最好使用0x3f3f3f3f进行赋值可以确保算法运行的万无一失。