以下是我从 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
为什么我们将中间值计算为中 = 低 + (高 - 低) / 2?有什么问题吗(高 + 低)/ 2
我有一个轻微的想法,这可能是为了防止溢出,但我不确定,也许有人可以向我解释一下,以及这背后是否还有其他原因。
虽然这个问题已经有5年历史了,但是有一个谷歌博客上的好文章 https://research.googleblog.com/2006/06/extra-extra-read-all-about-it-nearly.html详细解释了问题和解决方案,值得分享。
需要提到的是,在当前的二分搜索实现中Java https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#binarySearch-java.util.List-T- mid = lo + (hi - lo) / 2
不使用计算,而是使用零填充右移运算符更快、更清晰的替代方案
int mid = (low + high) >>> 1;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)