"Информатика. Учебное пособие для учреждений общего среднего образования с русским языком обучения", В.М. Котов, А.И. Лапо, Е.Н. Войтехович
Двоичный поиск помогает быстро найти элемент в наборе, если элементы расположены по порядку. Вместо проверки каждого значения он сравнивает искомое со средним элементом и оставляет для дальнейшего поиска только подходящую половину. Так область поиска — часть набора, где ещё может находиться ответ, — после каждого шага сокращается примерно вдвое. Поиск заканчивается, когда элемент найден или возможных мест больше не осталось.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Область поиска — часть упорядоченного набора, в которой ещё может находиться искомый элемент. Сначала такой областью служит весь набор, а потом она становится всё меньше. Это понятие помогает точно понимать, какие элементы осталось проверять.
Упорядоченный набор — последовательность элементов, расположенных по возрастанию или по убыванию. Например, числа 2, 5, 8, 11 идут по возрастанию, а 11, 8, 5, 2 — по убыванию. Порядок нужен, чтобы по сравнению значений решать, какую часть набора можно исключить.
Двоичный поиск — способ находить элемент в упорядоченном наборе, каждый раз сокращая область поиска примерно вдвое. Вместо проверки всех элементов по очереди мы сравниваем искомое значение со средним. Такой способ нужен, чтобы быстрее находить значения и определять их отсутствие.
Двоичный поиск требует упорядоченных данных, потому что сравнение со средним элементом должно сообщать, где искать дальше. Например, в наборе по возрастанию все элементы слева от среднего меньше него, а все справа — больше. Если набор перемешан, такого правила нет, и исключённая половина может содержать ответ.
В начале область поиска охватывает весь набор: пока ни один элемент не исключён. Для проверки выбирают средний элемент этой области. Он делит возможные места на левую и правую части, поэтому одно сравнение помогает решить, какую часть оставить.
Затем сравнивают средний элемент с искомым. Если набор упорядочен по возрастанию и искомое меньше среднего, справа искать незачем: там значения ещё больше. Если искомое больше среднего, исключают левую часть по той же причине и продолжают справа.
После сравнения проверенный средний элемент тоже убирают из области: его значение уже известно, и повторно проверять его не нужно. Оставшаяся область становится примерно вдвое меньше прежней. Этот шаг повторяют, пока не появится ответ или не останется элементов для проверки.
Если среднее значение совпало с искомым, элемент найден и поиск завершается. Если же область опустела, значит, все возможные места исключены и искомого элемента в наборе нет. Таким образом, у алгоритма есть два результата: найденное значение или вывод об отсутствии элемента.
| Ситуация | Что сравниваем | Как изменяется область поиска |
|---|---|---|
| Начало поиска | Искомый элемент и средний элемент области | Область охватывает весь набор; выбираем его середину |
| Искомый элемент меньше среднего | Искомый элемент и средний элемент | В наборе по возрастанию оставляем левую половину, не включая проверенную середину |
| Искомый элемент больше среднего | Искомый элемент и средний элемент | В наборе по возрастанию оставляем правую половину, не включая проверенную середину |
| Искомый элемент равен среднему | Искомый элемент и средний элемент | Элемент найден, поиск заканчивается |
| Область поиска опустела | Сравнивать больше нечего | Поиск заканчивается: элемента в наборе нет |
Пользуйся таблицей после каждого сравнения: сначала определи, меньше, больше или равен искомый элемент среднему. Затем измени границы области согласно нужной строке, исключив уже проверенную середину. Для набора по убыванию направления «лево» и «право» меняются местами.
Список упорядочен по возрастанию, поэтому можно применить двоичный поиск. Будем каждый раз сравнивать искомое число с серединой текущей области. Проверенный элемент не включаем в следующую область.
Ответ: число 11 найдено. Проверены элементы 8 и 11, всего выполнено два сравнения. Мы не проверяли 2, 5 и 14, потому что порядок списка позволил исключить их.
Список также упорядочен по возрастанию, поэтому после каждого сравнения можно отбросить половину. Нужно не просто искать совпадение, но и следить, не исчезла ли область поиска. Если она опустеет, числа 10 в списке нет.
Ответ: числа 10 в списке нет. Были проверены 12, 6 и 9, после чего не осталось возможных элементов. Пустая область — основание сделать вывод об отсутствии числа.
Значения шестнадцати элементов не указаны, поэтому проследить конкретные проверки нельзя. Но можно описать сокращение области, если 27 присутствует и на каждом шаге сравнение оставляет подходящую половину. Для оценки берём наибольшее число сравнений, нужное для нахождения элемента.
Ответ: для списка из 16 элементов потребуется не более 4 сравнений, если 27 в нём есть. Точный путь зависит от значений элементов и положения 27. Если число отсутствует, поиск продолжается до опустевшей области.
Искать в неупорядоченном наборе. Так поступают, потому что кажется, будто середина списка всегда делит элементы на меньшие и большие. Но это верно только при соблюдении порядка. Перед поиском проверь, расположены ли данные по возрастанию или убыванию.
Оставлять половину, где ответа быть не может. Ошибка возникает, если перепутать направление сравнения. Для набора по возрастанию значение меньше среднего ищут слева, а больше — справа. Проверь себя: в оставшейся части искомое ещё должно быть возможно.
Не исключать уже проверенный средний элемент. Если оставить его в области, алгоритм может повторно выбирать то же значение и зациклиться. После неравного сравнения сдвигай границу за середину. Убедись, что новая область стала меньше предыдущей.
Считать, что элемент обязательно найден. Так можно ошибиться, когда после нескольких шагов область опустела. Если проверять больше нечего, совпадения нет. Следи за границами и завершай поиск сообщением об отсутствии элемента.
Для двоичного поиска нужно уметь сравнивать числа или другие элементы и понимать порядок возрастания и убывания. Он связан с линейным поиском: сравни оба способа на одном наборе и посчитай проверки. Двоичный поиск особенно пригодится для отсортированных списков, каталогов и таблиц данных. В каждом случае его преимущество сохраняется только при наличии порядка.
Почему двоичный поиск нельзя применять к неупорядоченному списку?
В неупорядоченном списке положение среднего элемента ничего не говорит о значениях слева и справа от него. Поэтому нельзя надёжно отбросить половину списка: искомый элемент может оказаться в любой части.
Как определить, в какой половине продолжать поиск?
Сравни искомый элемент со средним. Если искомый меньше, продолжай в левой половине, а если больше — в правой; для списка по убыванию направление будет обратным.
Что делать, если средний элемент равен искомому?
Поиск завершён: нужный элемент найден. Запиши его значение или позицию, если требуется указать место в наборе.
Как понять, что искомого элемента в списке нет?
Продолжай сужать область поиска, пока она не станет пустой. Если возможных элементов для проверки не осталось, значит, искомого значения в списке нет.
Почему двоичный поиск обычно требует меньше сравнений, чем последовательный?
При последовательном поиске элементы проверяют один за другим. Двоичный поиск на каждом шаге отбрасывает примерно половину оставшихся вариантов, поэтому область быстро уменьшается.
7.2. Сокращение области поиска