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

Поиск в отсортированном массиве, который на каждом шаге исключает половину диапазона.

Обновлено 20 июля 2026
На этой странице
ИнтуицияКак это работаетСложностьРеализацияЧастые ошибкиИсточники
01
ИНТУИЦИЯ

Понять идею до написания кода

Сначала зафиксируйте диапазон, в котором ещё может находиться ответ. Сравните цель со средним элементом и отбросьте половину, которая точно не подходит. Повторяйте, пока цель не найдена или допустимый диапазон не опустеет.

Запомните главное

Корректность держится на инварианте: если ответ существует, после каждого шага он остаётся внутри активного диапазона.

02
ПОШАГОВО

Как это работает

ИНТЕРАКТИВНЫЙ РАЗБОР

Найдём элемент в массиве

10
41
72
103
134
165
196
227
258
13 = 13. Элемент найден по индексу 4.
03
АНАЛИЗ

Время и память

Лучший случайO(1)
Средний случайO(log n)
Худший случайO(log n)
Доп. памятьO(1) итеративно

Для статического отсортированного массива поиск занимает O(log n). Если тот же массив используется как динамическая таблица, вставка с сохранением порядка требует O(n) из-за сдвига элементов.

04
РЕАЛИЗАЦИЯ

Код без скрытых шагов

def binary_search(items, target):
    left, right = 0, len(items) - 1

    while left <= right:
        mid = left + (right - left) // 2
        if items[mid] == target:
            return mid
        if items[mid] < target:
            left = mid + 1
        else:
            right = mid - 1

    return -1
05
ПРОВЕРКА ПОНИМАНИЯ

Частые ошибки

01

Запускать поиск на неотсортированных данных.

02

Неправильно обновлять границы и получать бесконечный цикл.

03

Путать поиск любого совпадения с поиском первой или последней позиции.

04

Возвращать -1 по привычке, когда задаче нужна позиция вставки или граница диапазона.

06
ПРОВЕРКА ФАКТОВ

Источники и их роли

Источники решают разные учебные задачи: статья даёт переносимые соревновательные шаблоны, а книга объясняет, почему они корректны и где заканчивается их эффективность.

01 · CP-ALGORITHMSПрактический шаблон

Начните с полуинтервала и явного предиката. Затем переходите к lower/upper bound, поиску границы и бинарному поиску по ответу.

02 · ALGORITHMS, 4EИнвариант и стоимость

Рассматривайте rank и как индекс найденного ключа, и как позицию вставки. Поиск требует логарифмического числа сравнений, но вставка с сохранением порядка остаётся O(n).

Сначала выберите точный контракт ответа и сформулируйте инвариант границ; только после этого переносите подходящий шаблон в код.