Java 两种形式的数组中间索引的用法有什么不同吗?
我看到有两种方法可以找到数组中的中间索引Java 两种形式的数组中间索引的用法有什么不同吗?,java,arrays,Java,Arrays,我看到有两种方法可以找到数组中的中间索引 int middle=lowerBound+(上界lowerBound)/2 int-middle=(下限+上限)/2 是一样的吗?还是应该用不同的方法?因为我试图理解二进制搜索和合并排序。两者都必须使用它 非常感谢。您应该使用第一个。如果lowerBound+upperBound的值超过该类型的边界值,则第二个值可能会溢出。您应该使用第一个值。如果lowerBound+upperBound的值超过该类型的边界值,则第二个表达式可能会溢出。如果这是简单代
int middle=lowerBound+(上界lowerBound)/2
int-middle=(下限+上限)/2
非常感谢。您应该使用第一个。如果
lowerBound+upperBound
的值超过该类型的边界值,则第二个值可能会溢出。您应该使用第一个值。如果lowerBound+upperBound
的值超过该类型的边界值,则第二个表达式可能会溢出。如果这是简单代数,则这两个表达式将是等价的。复杂的是,x/2
不是你在代数中学过的那种除法,因为/
是整数除法,如果x
是奇数,它会丢掉小数部分。只有当上限-下限
为奇数时,这才有区别。所以说它很奇怪,特别是它是2N+1
,所以也就是上限
=下限+2N+1
。然后第一个表达式变为
lowerBound + ((2N + 1) / 2)
这与lowerBound+N
相同,因为多余的1/2会被丢弃。第二个变为
(lowerBound + (lowerBound + 2N + 1)) / 2
这也与lowerBound+N
相同lowerBound+lowerBound
和2N
都是偶数,因此1/2再次被丢弃
因此,除非发生溢出(参见Rohit的答案),否则这两个语句将产生相同的结果 如果这是简单代数,这两个表达式将是等价的。复杂的是,
x/2
不是你在代数中学过的那种除法,因为/
是整数除法,如果x
是奇数,它会丢掉小数部分。只有当上限-下限
为奇数时,这才有区别。所以说它很奇怪,特别是它是2N+1
,所以也就是上限
=下限+2N+1
。然后第一个表达式变为
lowerBound + ((2N + 1) / 2)
这与lowerBound+N
相同,因为多余的1/2会被丢弃。第二个变为
(lowerBound + (lowerBound + 2N + 1)) / 2
这也与lowerBound+N
相同lowerBound+lowerBound
和2N
都是偶数,因此1/2再次被丢弃
因此,除非发生溢出(参见Rohit的答案),否则这两个语句将产生相同的结果 你能澄清一下吗?(下限+上限)/2何时会大于最大上限?你是说,如果金额不能以“int”类型保存,比如说,@75英寸钢琴家是的。确切地例如,
lowerBound=5
,以及upperBound=Integer.MAX_VALUE
。您不会得到预期的结果。@75英寸钢琴家程序必须首先计算下限+上限。如果不能将其保存在int
类型中,则该加法的结果将是负值int
。那么当你除以2时,它仍然是负数。这就是我想确定的。用法完全相同或不同,不考虑溢出?你能澄清一下吗?(下限+上限)/2何时会大于最大上限?你是说,如果金额不能以“int”类型保存,比如说,@75英寸钢琴家是的。确切地例如,lowerBound=5
,以及upperBound=Integer.MAX_VALUE
。您不会得到预期的结果。@75英寸钢琴家程序必须首先计算下限+上限。如果不能将其保存在int
类型中,则该加法的结果将是负值int
。当你除以2时,它仍然是负数。这就是我的计算结果,只是为了确保。用法完全相同或不同,不考虑溢出?很好。总是一样的。所以我总是使用lower+(higher-lower)/2,这更安全,尤其是在面试中!好。总是一样的。所以我总是使用lower+(higher-lower)/2,这更安全,尤其是在面试中!