Python Glossary English

все Python 3bisectпонятие

Бинарный поиск через bisect

применение

bisect не проверяет наличие элемента, но можно реализовать бинарный поиск, проверив найденную позицию.

Синтаксис

i = bisect_left(a, x)
if i < len(a) and a[i] == x: found

Порядок условий важен: i < len(a) должно стоять первым, иначе для x больше всех элементов a[i] выбросит IndexError. Брать нужно именно bisect_left — bisect_right вернул бы позицию за найденным элементом, и сравнивать пришлось бы с a[i-1]. Смысл затеи — заменить O(n)-проверку x in a на O(log n), но это работает только на заранее отсортированном списке.

Примеры

import bisect
def search(a, x):
    i = bisect.bisect_left(a, x)
    return i if i < len(a) and a[i] == x else -1
a = [1, 3, 5, 7, 9]
print(search(a, 5))  # → 2
print(search(a, 4))  # → -1
print(search(a, 9))  # → 4

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности