C++ 为什么我们写lo+;二进制搜索中的(hi-lo)/2?

C++ 为什么我们写lo+;二进制搜索中的(hi-lo)/2?,c++,algorithm,binary-search,C++,Algorithm,Binary Search,我在读关于二进制搜索的书…我知道传统的查找中值的方法是 mid=(hi+lo)/2 但我也看到,为了避免溢出,中值是这样计算的 mid=lo+(hi-lo)/2 但是为什么呢??我找不到真正的原因。有人能举例说明原因吗?? 它与其他问题不同,因为其他问题没有我想要的答案,例如…从数学上讲,它们是等价的 在计算机术语中,mid=(hi+lo)/2具有较少的操作,但是为了避免溢出,首选mid=lo+(hi-lo)/2 假设您正在搜索的项目接近数组的末尾,则hi+lo接近2*大小。由于size几乎

我在读关于二进制搜索的书…我知道传统的查找中值的方法是

mid=(hi+lo)/2
但我也看到,为了避免溢出,中值是这样计算的

mid=lo+(hi-lo)/2
但是为什么呢??我找不到真正的原因。有人能举例说明原因吗??
它与其他问题不同,因为其他问题没有我想要的答案,例如…

从数学上讲,它们是等价的

在计算机术语中,
mid=(hi+lo)/2
具有较少的操作,但是为了避免溢出,首选
mid=lo+(hi-lo)/2


假设您正在搜索的项目接近数组的末尾,则
hi+lo
接近
2*大小
。由于
size
几乎可以与最大索引一样大,
2*size
因此
hi+lo
可能会溢出。

假设使用32位
无符号int
作为索引搜索4000000000个元素数组

第一步使它看起来好像搜索的元素(如果存在)将位于上半部分
lo
的值为
2000000000
hi
的值为
4000000000

hi+lo
溢出并产生小于预期值的值
600000000
。它实际上生产600000000-232。因此,
(hi+lo)/2
是一个小值。它不在
lo
hi
之间

从那时起,搜索将是错误的(它可能会得出结论,即使元素存在,也不存在)


相比之下,即使使用本例中的极值,
lo+(hi-lo)/2
也总是按照算法的预期,计算介于
hi
lo
之间的索引。

原因在您的问题中,为了避免溢出。这个问题是离题的,因为它是带问号的答案。我没有得到任何示例。我想要示例。假设hi和lo是指针(或C++中的迭代器)。两个指针的总和没有意义。两个指针的差就是一个整数。将整数添加到指针也有意义。
hi+lo
可能会溢出<如果
lo,hi
是范围内的正整数,
lo+(hi-lo)/2
将永远不会溢出,并且
lo数值溢出与可寻址空间的大小无关,但与可由数值类型表示的范围有关。@Mike Seymour,已修复。@ikegami因为我选择了
无符号int
类型,加法不是未定义的行为,它只是定义为生成环绕结果。有趣。谢谢。当16位体系结构统治地球时,这个问题更可能出现。@MarkRansom谷歌工程师(重新)在2006年发现了32位体系结构: