为什么这种二分查找实现会导致溢出?

发布于 2024-10-13 07:05:32 字数 316 浏览 6 评论 0原文

在二分查找的实现中

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;

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

In the implementation of binary search

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
     ...
  }
}

The correct method is as follows:

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

I don't know why the updated statement has no overflow issue. Based on my understanding,
soon or later, the updated statement will also have overflow issue.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

烈酒灼喉 2024-10-20 07:05:32

原始数据可能会溢出,因为 l+u 可能大于 int 可以处理的最大值(例如,如果 luINT_MAX 那么它们的总和显然会超过 INT_MAX)。

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

The orignal may have overflow because l+u could be greater than the maximum value an int can handle (e.g. if both l and u were INT_MAX then their sum would obviously exceed INT_MAX).

The correct method can't overflow, because u-l obviously won't overflow, and l+(u-l)/2 is guaranteed to be <=u, so can't overflow either.

救星 2024-10-20 07:05:32

由于添加了非常大的数字,m = (l+u)/2 的初始计算会产生溢出。
因此,这些数字的差异不会导致这种溢出情况,这就是我们使用此公式计算 m=l+(ul)/2 的原因。

The initial Calculation of m = (l+u)/2 create overflow due to addition of very large numbers.
So, Difference of these numbers does not cause this overflow condition ,that's why we are calculating m=l+(u-l)/2 using this formula.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文