当我从教科书中学习算法时,通常伪码的算法尽可能通用。
一个例子是,为了简化检查或边界情况或何时停止循环,使用了 - / +无穷大(当然是简化)。
例如:
current-sum=
total-sum=0
for i=x downto low
total-sum=total-sum+A[i]
if(total-sum > current-sum) //so that in first iteration we will enter the if statement
etc
好的,当在编程语言中实现算法时,可以替换负无穷大,其值在我们的问题域中是不期望的。
我想知道是否有更通用的方法/技巧来表示在使用具体编程语言(例如Java)实现算法时,而不是:
例如
current-sum = -1;
或
current-sum = -10000;
这些值后来实际上可以作为域值有效。
答案 0 :(得分:3)
我想知道在用具体的编程语言实现算法时是否有更通用的方法/技巧来表示
一般没有。无法将“负无穷大”表示为始终有效的整数。通常使用最小的整数值(在Java Integer.MIN_VALUE
中)。但您需要查看特定算法以了解此解决方案是否有效。
因此没有通用/通用解决方案。
在您的示例中,Integer.MIN_VALUE
可用于代替“负无穷大”。然而,
如果算法要求您使用Integer.MIN_VALUE
作为实际值,则您不能 将其用作“无值”标记。 Integer.MIN_VALUE
不能作为“负无穷大”代理的另一种情况是当你用它来算术时。 (Integer.MIN_VALUE + x == Integer.MIN_VALUE
仅适用于x == 0
。)
答案 1 :(得分:2)
您可以使用Integer.MIN_VALUE
这是最小的32位可表示值(-2 ^ 31)。
或者,如果这实际上可能是您问题中的有效值,则可以扩展到64位并使用Long.MIN_VALUE
。
最后,boolean firstTime = true;
始终可以||
选择if
第一次false
条件,并立即将其设置为{{1}}。
答案 2 :(得分:1)
int current_sum = Integer.MIN_VALUE;
这为current_sum提供了int可以拥有的最小值, - (2 ^ 31)。
答案 3 :(得分:1)
通常,您使用适合您的数据类型的最大值来表示无穷大。
例如,如果您有+ inifity,则可以使用Integer.MAX_VALUE
。
与-infinity相同,您可以使用Integer.MIN_VALUE
。
与其他数据类型相同。
答案 4 :(得分:1)
Integer.MIN_VALUE
和Integer.MAX_VALUE
糟糕的解决方案,因为在某些情况下,它们可以成为您网域中的值。更谨慎地使用Double.NEGATIVE_INFINITY
。
例如Double.NEGATIVE_INFINITY + 2 = Double.NEGATIVE_INFINITY