如果提供给定值,我试图在列表/数组上进行二进制搜索。 这是我的代码:
item = "dog"
list = ["banana","dog","apple","britain","light","error","brother"]
length = len(list)
guess = (length + 1) // 2
counter = 0
while list[guess] != item:
counter = counter + 1
print("False")
if guess < list.index(item):
for i in range(guess):
del list[i]
else:
largest = list[-1]
for i in range(guess, list.index(largest)):
del list[i]
length = len(list)
guess = (length + 1) // 2
print(f"I found {list[guess]} and it took {counter} tries.")
我希望它在我的列表中对“dog”这个词执行二进制搜索,但它会陷入困境而只是循环并连续打印错误。我不确定为什么。
如果有人能够纠正我的代码,并告诉我有什么问题,我会非常感激。
答案 0 :(得分:2)
我写了一个函数来做bs而我只是回答这个问题,但现在我觉得最好告诉你应该如何进行二分搜索。
允许my_list = [2, 4, 1, 6, 3, 5]
和我们的项目5
。为了进行二进制搜索,我们首先需要对列表进行排序,因此在我们的案例中my_list = [1, 2, 3, 4, 5, 6]
。
您需要跟踪两个位置,我们将其称为lo
和hi
,代表低位和高位。我们初始化lo = 0
和hi = len(my_list) - 1
[1, 2, 3, 4, 5, 6]
l h
0 5
然后我们在这种情况下mid = (hi+lo) // 2
将两者的中间值计算为mid = 2
。 (a//b
与math.floor(a/b)
)
我们现在将项目(5
)与my_list[mid]
(3
)进行比较,我们的项目更大,因此我们知道项目的位置必须高于{{1所以我们可以说mid
lo = mid + 1
我们重新计算[1, 2, 3, 4, 5, 6]
l h
3 5
和mid = (lo + hi // 2)
。我们将mid = 4
(my_list[mid]
)与项目(5
)进行比较,我们可以知道该项目的索引为5
。
这个解释含糊不清,您必须考虑是否应该mid
或lo = mid + 1
,当项目低于中间时会发生什么,当项目不在列表中时会发生什么。但既然你正在研究这个问题,我会让你考虑一下。
希望它有所帮助!