为什么我们在二叉搜索中写lo+(hi-lo)/2
Why we write lo+(hi-lo)/2 in binary search?
我正在阅读有关二进制搜索的信息...我知道寻找中等价值的传统方法是
mid=(hi+lo)/2
但我也看到,为了避免溢出中间值是这样计算
的mid=lo+(hi-lo)/2
但是为什么??我找不到实际原因..谁能给我举例说明原因??它与其他问题不同,因为其他问题没有我想要的答案......
假设您正在使用 32 位unsigned int
作为索引搜索一个 4000000000 个元素的数组。
第一步使搜索的元素(如果存在(看起来好像在上半部分。 lo
的值是 2000000000
,hi
的值是4000000000
。
hi + lo
溢出并产生小于预期6000000000
的值。它实际上产生6000000000-232。因此,(hi + lo) / 2
是一个很小的值。它甚至不是在lo
和hi
之间!
从那时起,搜索将是错误的(它可能会得出结论,即使元素存在,元素也不存在(。
相比之下,即使使用此示例中的极值,lo + (hi - lo) / 2
也总是按照算法的意图计算介于 hi
和 lo
之间的索引。
从
数学上讲,它们是等价的。
在计算机术语中,mid=(hi+lo)/2
的操作较少,但最好使用mid=lo+(hi-lo)/2
以避免溢出。
假设您要搜索的项目靠近数组的末尾,那么hi+lo
几乎是2*size
。由于size
几乎可以与最大索引一样大,因此2*size
,因此hi+lo
可能会溢出。