Я скопировал код из книги «Гроккинговые алгоритмы» для поиска элемента в списке с помощью алгоритма двоичного поиска. Код отлично запускается и не возвращает ошибок. Однако иногда это просто не работает для определенных номеров, например, если я звоню, чтобы найти «1». Что случилось?

def binary_search(list, item):
    low = 0
    high = len(list) - 1

    while low <= high:
        mid = (low + high)/2
        guess = list[mid]
        if guess == item:
            return mid
        if guess > item:
            high = mid + 1
        else:
            low = mid + 1
    return None

list1 = []

for i in range (1, 101):
    list1.append(i)

print(list1)
print(binary_search(list1, 1))
0
Ela Rednax 19 Мар 2021 в 18:28

1 ответ

Лучший ответ

Две проблемы:

  • Используйте целочисленное деление (чтобы оно работало в Python 3): mid = (low + high)//2

  • Когда guess > item вы хотите исключить предполагаемое значение из следующего диапазона, но с high = mid + 1 оно все еще находится в диапазоне. Правильно на high = mid - 1

2
trincot 19 Мар 2021 в 16:40