我正在尝试解决二进制搜索问题,但是,由于lo
hi
和mid
的值没有像预期的那样变化,所以我一直遇到无限循环。我正在尝试在函数count_lines(mid,k) >= n
中搜索最小中间值。我已经花了几个小时来调试该代码,但是我仍然无法弄清lo
hi
和mid
的值出了什么问题。有人可以看看我的代码,然后告诉我为什么会这样吗?非常感谢!
失败的测试用例,其中:n=9
k=2
这是我的代码:
def count_lines(v,k):
...
...
return count_lines #count_lines is an integer`
def binarySearch_v(n, k):
lo = 0
hi = n
mid = (lo + hi)//2
while (lo <= hi):
if (count_lines(mid, k) < n):
lo = mid
elif (count_lines(mid, k) > n):
hi = mid
elif (count_lines(mid, k) >= n and count_lines(mid-1, k) < n):
return mid
mid = (lo + hi) // 2
def main():
print(binarySearch_v(n,k)) # Failed at n=9 & k=2
main()
答案 0 :(得分:2)
这是您的终止条件:
while (lo <= hi):
这是lo
和hi
可以更改值的地方:
lo = mid
...
hi = mid
合乎逻辑的结论是,如果这段代码循环了足够的时间,您将得到lo == hi
。然后,mid
将被设置为两者的平均值,即两者均相等,这就是所有三个变量都将保留的位置。因此,循环不会终止。有两种可能的解决方案:要么更改您重新分配lo
或hi
的方式,要么将终止条件更改为<
而不是<=
。