15 страница22 апреля 2026, 21:52

1 ГЛАВА 'Более эффективный поиск'

Существует другой, более эффективный способ. Начнем с 50.

68f75690d8364f30e32b2ae591e373a8.avif

Слишком мало ... но вы только что исключили половину чисел! Теперь вы знаете, что все числа 1-50 меньше загаданного. Следующая попытка: 75.

209d813a1ffdb00f4dc02615a865053c.avif

На этот раз перелет ... Но вы снова исключили половину оставшихся чисел! С бинарным поиском вы каждый раз загадываете число в середине диапазона и исключаете половину оставшихся чисел. Следующим будет число 63 (по середине между 50 и 75).

6e58225c07e32b88a263cb5323bbe597.avif

Так работает бинарный поиск. А вы только что узнали свой первый алгоритм! Попробуем поточнее определить, сколько чисел будет исключаться каждый раз.

6645a41661f7a6ba442f8d53f08248a7.avif

При бинарном поиске каждый раз исключается половина чисел

Какое бы число я ни задумал, вы гарантированно сможете угадать его не более чем за 7 попыток, потому что с каждой попыткой исключается половина оставшихся чисел!


Предположим, вы ищете слово в словаре с 240 ООО словами. Как вы думаете, сколько попыток вам понадобится в худшем случае?

2f042c1fb962e1c24e77d37131e840e9.avif

При простом поиске может потребоваться 240 ООО попыток, если искомое слово находится на самой последней позиции в книге. С каждым шагом бинарного поиска количество слов сокращается вдвое , пока не останется только одно слово.

b0bbb9227f44526f0b4c2ce0a266b068.avif

Итак, бинарный поиск потребует 18 шагов - заметная разница! В общем случае для списка из п элементов бинарный поиск выполняется за log2n шагов, тогда как простой поиск будет выполнен за n шагов.

489571b03e9ff48a515bde2afe33aea0.avif


ПРИМЕЧАНИЕ
Бинарный поиск работает только в том случае, если список отсортирован. Например, имена в телефонной книге хранятся в алфавитном порядке, и вы можете воспользоваться бинарным поиском. А что произойдет, если имена не будут отсортированы?

Посмотрим, как написать реализацию бинарного поиска на Python. В следующем примере кода используется массив. Если вы не знаете, как работают массивы, не беспокойтесь: эта тема рассматривается в следующей главе.Пока достаточно знать , что серию элементов можно сохранить в непрерывной последовательности ячеек, которая называется массивом. Нумерация ячеек начинается с О: первая ячейка находится в позиции с номером О,вторая - в позиции с номером 1 и т. д.

Функция binary_search получает отсортированный массив и значение. Если значение присутствует в массиве, то функция возвращает его позицию. При этом мы должны следить за тем, в какой части массива проводится поиск.Вначале это весь массив:

ef793cc710e3547080216c498e5e5ba0.avif


Каждый раз алгоритм проверяет средний элемент:

64b762fb95dbe37ee6bbad829615539f.avif

Если названное число было слишком мало, то переменная low обновляется
соответственно:

a4e2af63d5c60e88acffda32de4540a7.avif

А если догадка была слишком велика, то обновляется переменная high. Полный
код выглядит так:

13775e4eb7394fb1e9caebf30f95bc15.avif



УПРАЖНЕНИЯ

1.1 Имеется отсортированный список из 128 имен, и вы ищете в нем значение
методом бинарного поиска. Какое максимальное количество
проверок для этого может потребоваться?


1.2 Предположим, размер списка увеличился вдвое. Как изменится максимальное
количество проверок?

15 страница22 апреля 2026, 21:52

Комментарии

0 / 5000 символов

Форматирование: **жирный**, *курсив*, `код`, списки (- / 1.), ссылки [текст](https://…) и обычные https://… в тексте.

Пока нет комментариев. Будьте первым!