自行实现的二分查找算法出现死循环,错误点如何排查?
问题分析
你的代码死循环的核心原因是左边界更新逻辑错误,和循环条件无关:
你当前的区间定义是左闭右开[l, r),当判断a[m] < x时,说明m位置的元素已经明确小于目标值,不可能是最终结果,下一轮的搜索左边界应该跳过m,但你错误的把l赋值为m,就会出现区间无法收缩的死循环场景。
以你给出的测试用例a = [1, 2]、x = 2为例,死循环的触发流程:
- 初始
l=0,r=2,进入循环,计算m=(0+2)//2=1 a[1] = 2不满足a[m] < x,所以r = m = 1,此时区间为[0, 1)- 循环条件
r-l = 1 > 0继续执行,计算m=(0+1)//2=0 a[0] = 1满足a[m] < x,你错误赋值l = m = 0,区间回到[0, 1),一直重复步骤3、4陷入死循环
修复方案
只需要修改左边界的更新逻辑,把l = m改为l = m + 1即可,同时可以补充数组越界防御逻辑,避免空数组等场景报错。
修复后的完整代码:
def binary_search(a, x): l = 0 r = len(a) while r - l > 0: m = (l + r) // 2 if a[m] < x: l = m + 1 # 仅修改这一行 else: r = m # 补充边界判断,避免l超出数组下标范围报错 return l if l < len(a) and a[l] == x else -1
修复后测试用例执行流程
还是a = [1, 2]、x = 2的场景:
- 初始
l=0,r=2,进入循环,m=1,a[1]=2不小于x,r=1 - 区间
[0,1)满足循环条件,m=0,a[0]=1 < 2,赋值l = 0 + 1 = 1 - 此时
r-l=0退出循环,判断l=1 < 2且a[1]==2,返回1,结果正确
内容的提问来源于stack exchange,提问作者Mihail
相关产品推荐
相关产品推荐

