binary-search - 二分查找中间值计算

标签 binary-search

以下是我从有关二进制搜索的TopCoder教程中获得的伪代码

binary_search(A, target):
   lo = 1, hi = size(A)
   while lo <= hi:
      mid = lo + (hi-lo)/2
      if A[mid] == target:
         return mid            
      else if A[mid] < target: 
         lo = mid+1
      else:
         hi = mid-1

   // target was not found

为什么我们将中间值计算为mid = lo +(hi-lo)/ 2? (hi + lo)/ 2有什么问题

我有一个轻微的想法,那就是防止溢出,但是我不确定,也许有人可以向我解释一下,以及背后是否还有其他原因。

最佳答案

虽然这个问题已有5年历史了,但是有一个great article in googleblog可以详细解释问题和解决方案,值得分享。

需要指出的是,在Java的当前二进制搜索实现中,不使用mid = lo + (hi - lo) / 2计算,而是使用零填充右移运算符来提供更快,更清晰的替代方法

int mid = (low + high) >>> 1;

关于binary-search - 二分查找中间值计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4534342/

相关文章:

c# - C#Array.BinarySearch问题

c - 尝试二分查找

c++ 对日期进行二分搜索排序 -> 我需要一个范围(cca)

c# - 对 DateTime 范围的二进制搜索

algorithm - 停止二分查找的证明

arrays - 使用二进制搜索的三元组总和

c - 二分查找出现无限循环,为什么?

java - java中的二分查找字符串

c++ - 快速搜索以查找事件范围

C++二进制搜索没有成功运行......永远