python中的二进制搜索程序不会停止循环

时间:2017-11-06 00:16:24

标签: python algorithm python-3.x binary-search

如果提供给定值,我试图在列表/数组上进行二进制搜索。 这是我的代码:

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”这个词执行二进制搜索,但它会陷入困境而只是循环并连续打印错误。我不确定为什么。

如果有人能够纠正我的代码,并告诉我有什么问题,我会非常感激。

1 个答案:

答案 0 :(得分:2)

我写了一个函数来做bs而我只是回答这个问题,但现在我觉得最好告诉你应该如何进行二分搜索。

允许my_list = [2, 4, 1, 6, 3, 5]和我们的项目5。为了进行二进制搜索,我们首先需要对列表进行排序,因此在我们的案例中my_list = [1, 2, 3, 4, 5, 6]

您需要跟踪两个位置,我们将其称为lohi,代表低位和高位。我们初始化lo = 0hi = len(my_list) - 1

[1, 2, 3, 4, 5, 6]
 l              h
 0              5

然后我们在这种情况下mid = (hi+lo) // 2将两者的中间值计算为mid = 2。 (a//bmath.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 = 4my_list[mid])与项目(5)进行比较,我们可以知道该项目的索引为5

这个解释含糊不清,您必须考虑是否应该midlo = mid + 1,当项目低于中间时会发生什么,当项目不在列表中时会发生什么。但既然你正在研究这个问题,我会让你考虑一下。

希望它有所帮助!