Алгоритм бинарного поиска позволяет отыскать элемент в упорядоченном списке. Этот алгоритм довольно широко применяется для решения задач, в которых требуется отыскать индекс заданного элемента последовательности или выяснить, присутствует ли в этой последовательности искомый элемент. Конечно, в Python есть замечательный оператор in
, который выдаст True или False при попытке отыскать с его помощью элемент в списке. Но этот вариант, так же как и линейный поиск, уступает по производительности бинарному поиску, так как справляется с поставленной задачей за O(N) шагов. В то время, как производительность бинарного поиска O(logN) шагов — за это его и любят 😉
Производительность бинарного поиска O(logN) шагов
Полезная информация
Кроме того, алгоритм бинарного поиска довольно прост в реализации и интуитивно понятен. В чем вы сейчас и убедитесь. Я кратко набросаю основные тезисы, а после — добавлю 2 варианта реализованного алгоритма. Если что-то будет не понятно из тезисов, код вам в помощь, друзья! 😉
Алгоритм бинарного поиска:
Цель: получить позицию искомого элемента в упорядоченном списке
Последовательсть действий при реализации алгоритма:
- Делим упорядоченный список на 2 части и находим средний элемент
- Сравниваем средний элемент с искомым значением. Если значения равны, то возвращаем индекс среднего элемента. Если средний элемент меньше искомого, повторяем шаги 1-2 для левой части, если больше — для правой.
Производительность: Если данные содержат N элементов, то для итерации потребуется максимум O(logN) шагов.
Реализация: Бинарный поиск можно реализовать как рекурсивным, так и итеративным способом. Для большей наглядности сначала рассмотрим реализацию алгоритма итеративным способом на основе цикла while
.
Реализуем бинарный поиск на Python итеративным способом:
def binary_search(lst, item):
# определяем начальный и
#конечный элементы:
first = 0
last = len(lst) - 1
while first <= last:
# находим средний элемент
mid = (first + last) // 2
if lst[mid] == item:
return mid
# если средний эл-т больше искомого:
elif lst[mid] > item:
last = mid — 1
# если средний эл-т меньше искомого:
else:
first = mid + 1
return None
# Протестируем на примере:
nums = [1, 3, 5, 7, 9, 11]
print(binary_search(nums, 7))
Бинарный поиск рекурсивным способом
В основе рекурсивного способа лежит вызов функцией самой себя:
def binary_search(lst, item, first, last):
if first <= last:
# находим средний элемент
mid = (first + last) // 2
if lst[mid] == item:
return mid
# если средний эл-т больше искомого:
elif lst[mid] > item:
return binary_search1(lst, item, first, mid-1)
# если средний эл-т меньше искомого:
elif lst[mid] < item:
return binary_search1(lst, item, mid+1, last)
else:
return None
# Протестируем на примере:
nums = [1, 3, 5, 7, 9, 11]
print(binary_search(nums, 7))
Вывод на экран: 3
У нас появился Telegram-канал для изучающих Python! Присоединяйтесь: вместе «питонить» веселее! 😉 Ссылка на канал: «Кодим на Python!»