我正在尝试使用二进制搜索来实现解决方案。我有一个数字列表
list = [1, 2, 3, 4, 6]
value to be searched = 2
我写过类似的东西
def searchBinary(list, sval):
low = 0
high = len(list)
while low < high:
mid = low + math.floor((high - low) / 2)
if list[mid] == sval:
print("found : ", sval)
elif l2s[mid] > sval:
high = mid - 1
else:
low = mid + 1
但是当我尝试实现这个时,我收到的错误如下:index超出范围。请帮助确定问题。
答案 0 :(得分:2)
一些事情。
您的命名不一致。另外,不要使用list
作为变量名称,而是要遮蔽全局内置函数。
停止条件为while low <= high
。这个很重要。
找到值时不会中断。这将导致无限递归。
def searchBinary(l2s, sval): # do not use 'list' as a variable
low = 0
high = len(l2s)
while low <= high: # this is the main issue. As long as low is not greater than high, the while loop must run
mid = (high + low) // 2
if l2s[mid] == sval:
print("found : ", sval)
return
elif l2s[mid] > sval:
high = mid - 1
else:
low = mid + 1
现在,
list_ = [1, 2, 3, 4, 6]
searchBinary(list_, 2)
输出:
found : 2
答案 1 :(得分:1)
更新 high = len(lst) - 1
。
三个问题:
l2s
代替list
(参数的实际名称)。while
条件应为low <= high
,而不是low < high
。None
(或者可能是-1?)。我做了其他一些小改动:
list
是一个坏主意。我将参数重命名为lst
,这种情况在Python中常用。mid = (low + high) // 2
是找到中点的简单形式。固定代码:
def binary_search(lst, sval):
low = 0
high = len(lst) - 1
while low <= high:
mid = (low + high) // 2
if lst[mid] == sval:
return mid
elif lst[mid] > sval:
high = mid - 1
else:
low = mid + 1
return None
print(binary_search([1, 2, 3, 4, 6], 2)) # 1