为什么这个二进制搜索实现导致溢出

时间:2011-01-21 23:09:40

标签: algorithm

在二元搜索的实现中

int search(int[] A, int K) {
  int l = 0;
  int u = A.length - 1;
  int m
  while ( l <= u ) {
     m = (l+u)/2; // why this can cause overflow
     ...
  }
}

正确的方法如下:

m = l + (u -l )/2;

我不知道为什么更新后的语句没有溢出问题。根据我的理解, 不久之后,更新后的声明也会出现溢出问题。

谢谢

2 个答案:

答案 0 :(得分:4)

由于l+u可能大于int可以处理的最大值(例如,如果lu都是INT_MAX,则原始信号可能会溢出那么他们的总和显然会超过INT_MAX)。

正确的方法不会溢出,因为u-l显然不会溢出,l+(u-l)/2保证为<=u,所以也不会溢出。

答案 1 :(得分:0)

m = (l+u)/2的初始计算由于添加了非常大的数字而导致溢出。 因此,这些数字的差异不会导致这种溢出情况,这就是我们使用此公式计算m=l+(u-l)/2的原因。 希望你能得到答案