二分搜索中为何给下界加1?能否替换lo=mid+1与hi=mid-1?
嘿,这个问题问得特别精准——二分搜索的边界调整绝对是新手最容易卡壳的点,我来给你讲明白其中的逻辑:
能不能直接替换成lo = mid和hi = mid?
绝对不能,直接替换会导致死循环。举个简单的例子:
假设数组A = [1,3],要搜索的target = 3。
按照修改后的代码执行:
- 初始
lo=1,hi=2,mid = 1 + (2-1)/2 = 1 - 此时
A[mid] = 1 < 3,所以lo = mid = 1 - 循环条件
lo <= hi依然成立,接下来计算的mid还是1,重复步骤2,永远跳不出循环
这是因为当搜索范围缩小到只剩两个元素时,修改后的边界调整无法让搜索范围收敛到空,导致无限循环。
为什么要写lo = mid+1和hi = mid-1?
核心原因是:当A[mid] != target时,mid这个位置已经被彻底排除在可能的搜索范围之外了。
- 当
A[mid] < target:说明target一定在mid的右侧(因为数组是有序的),所以下一次搜索的左边界应该从mid+1开始——mid本身已经比目标小,不可能是要找的元素,没必要再留在搜索范围内。 - 当
A[mid] > target:同理,target一定在mid的左侧,所以下一次搜索的右边界要设为mid-1——mid本身比目标大,直接排除。
这种写法的本质是每次循环都严格缩小搜索范围,确保循环一定会终止(因为lo和hi的差值每次至少减少1)。
补充:另一种二分搜索写法
如果非要用lo = mid或者hi = mid,那得把循环条件改成lo < hi,这是另一种常见的二分搜索范式(比如用来找下界),但逻辑和你现在的代码完全不同,不能直接替换原代码的边界调整方式。
内容的提问来源于stack exchange,提问作者asndonsadoasndo231213
相关产品推荐
相关产品推荐

