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,这更安全,尤其是在面试中!