为什么我们在二叉搜索中写lo+(hi-lo)/2

Why we write lo+(hi-lo)/2 in binary search?

本文关键字:lo+ hi-lo 我们 搜索 为什么      更新时间:2023-10-16

我正在阅读有关二进制搜索的信息...我知道寻找中等价值的传统方法是

mid=(hi+lo)/2

但我也看到,为了避免溢出中间值是这样计算

mid=lo+(hi-lo)/2

但是为什么??我找不到实际原因..谁能给我举例说明原因??它与其他问题不同,因为其他问题没有我想要的答案......

假设您正在使用 32 位unsigned int作为索引搜索一个 4000000000 个元素的数组。

第一步使搜索的元素(如果存在(看起来好像在上半部分。 lo 的值是 2000000000hi 的值是4000000000

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

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

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

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

在计算机术语中,mid=(hi+lo)/2的操作较少,但最好使用mid=lo+(hi-lo)/2以避免溢出。

假设您要搜索的项目靠近数组的末尾,那么hi+lo几乎是2*size。由于size几乎可以与最大索引一样大,因此2*size,因此hi+lo可能会溢出。