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位体系结构: