我在阅读有关二分查找的内容...我知道传统的查找中间值的方法是这样的:
mid=(hi+lo)/2
但我也看到为了避免溢出,中间值是这样计算的。
mid=lo+(hi-lo)/2
但是为什么呢?我找不到实际的原因...有人能给我一个带有例子的解释吗?与其他问题不同,因为其他问题没有像我想要的带有例子的答案...
我在阅读有关二分查找的内容...我知道传统的查找中间值的方法是这样的:
mid=(hi+lo)/2
但我也看到为了避免溢出,中间值是这样计算的。
mid=lo+(hi-lo)/2
但是为什么呢?我找不到实际的原因...有人能给我一个带有例子的解释吗?与其他问题不同,因为其他问题没有像我想要的带有例子的答案...
unsigned int
类型,所以这个加法不是未定义行为,而是被定义为产生环绕结果。 - Pascal Cuoq数学上讲,它们等同。
在计算机术语中,“mid=(hi+lo)/2” 的操作较少,但“mid=lo+(hi-lo)/2” 更受欢迎以避免溢出。
例如,如果您要搜索的项目靠近数组末尾,则“hi+lo”将接近“2*size” 。由于“size”几乎可以与最大索引一样大,“2*size”和因此“hi+lo”可能会溢出。