Открыть сервис

Бинарный поиск

Бинарный поиск (двоичный поиск, метод деления пополам) — это алгоритм поиска элемента в упорядоченном массиве данных, основанный на последовательном сравнении искомого значения со средним элементом массива и сужении области поиска вдвое на каждом шаге. Относится к классу алгоритмов «разделяй и властвуй». Гарантирует нахождение элемента за логарифмическое время O(log n), что делает его одним из наиболее эффективных методов поиска в отсортированных структурах данных.

История

Первое известное описание бинарного поиска в систематизированном виде принадлежит американскому математику и инженеру Джону Мочли, который в 1946 году в лекциях по информатике предложил алгоритм для поиска в отсортированных списках. Однако практическое применение алгоритма стало возможным только с развитием электронных вычислительных машин. В 1960-х годах бинарный поиск был формализован и включён в стандартные библиотеки алгоритмов. Ключевую роль в популяризации метода сыграла книга Дональда Кнута «Искусство программирования» (том 3, 1973 год), где бинарному поиску посвящён отдельный раздел. В советской информатике алгоритм широко применялся с 1960-х годов в системах управления базами данных и научных расчётах.

Принцип работы

Алгоритм бинарного поиска применим только к предварительно отсортированным данным (по возрастанию или убыванию). Основные этапы:

  1. Определение границ: задаются левая (left) и правая (right) границы интервала поиска. Для массива длиной n начальные значения: left = 0, right = n-1.
  2. Вычисление среднего индекса: mid = (left + right) // 2 (целочисленное деление). В некоторых реализациях для избежания переполнения используют формулу mid = left + (right - left) // 2.
  3. Сравнение: элемент array[mid] сравнивается с искомым значением key:
  1. Повторение: шаги 2-3 выполняются до тех пор, пока left <= right. Если границы смыкаются и элемент не найден, возвращается признак отсутствия (обычно -1).

Пример

Для массива [2, 5, 8, 12, 16, 23, 38, 45, 56, 69] и поиска числа 23:

Шагleftrightmidarray[mid]Сравнение
10941616 < 23 → сдвиг вправо
25974545 > 23 → сдвиг влево
35652323 == 23 → найдено

Классификация

Бинарный поиск имеет несколько вариантов реализации, различающихся по условиям применения и возвращаемым результатам:

По типу данных

По поведению при наличии дубликатов

По типу данных и структуре

Реализация на языках программирования

Пример на C

``c int binarySearch(int arr[], int size, int target) { int left = 0, right = size - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) return mid; if (arr[mid] < target) left = mid + 1; else right = mid - 1; } return -1; } ``

Пример на Python

``python def binary_search(arr, target): left, right = 0, len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ``

Сложность

Сравнение с другими методами поиска:

АлгоритмВременная сложность (худший случай)Требование к данным
Линейный поискO(n)Не требуют сортировки
Бинарный поискO(log n)Обязательна сортировка
ИнтерполяционныйO(log log n) в среднемРавномерное распределение данных
Поиск прыжкамиO(√n)Требуется сортировка

Применение

В информатике и программировании

В научных расчётах

В базах данных

В повседневных алгоритмах

Ошибки и подводные камни

Несмотря на кажущуюся простоту, бинарный поиск подвержен ряду ошибок при реализации:

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →