DEV//UNIT
← АлгоритмыSearch & Arrays

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

Находим число в отсортированном массиве, отбрасывая половину зоны поиска на каждом шаге.

время O(log n)память O(1)уровень: начальный
Что происходит сейчас0/0
Нажмите Play, чтобы запустить сценарий
TypeScript — активная строка подсвечена шагом
1function binarySearch(arr: number[], target: number): number {
2 let lo = 0
3 let hi = arr.length - 1
4
5 while (lo <= hi) {
6 const mid = Math.floor((lo + hi) / 2)
7
8 if (arr[mid] === target) return mid
9
10 if (arr[mid] < target) {
11 lo = mid + 1
12 } else {
13 hi = mid - 1
14 }
15 }
16
17 return -1
18}

Проблема

Как найти одно число среди миллиона, проверив всего около 20 позиций? Единственное условие — массив отсортирован. Линейный проход проверяет элементы по очереди (до миллиона проверок), бинарный поиск каждый раз делит зону поиска пополам.

Что вы видите

Массив — полка с числами. Зона поиска — подсвеченный диапазон полки. Три указателя: lo (левая граница), mid (середина), hi (правая граница). На каждом шаге середина сравнивается с целью, и половина зоны гаснет — она точно не содержит ответ.

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

Делим зону поиска пополам и спрашиваем: цель левее или правее середины? Отсортированность гарантирует, что весь кусок по ненужную сторону можно выбросить целиком. За log₂(n) делений зона схлопывается до одного элемента: либо нашли, либо числа нет.

Пошаговый разбор

  1. 01

    Зона — весь массив

    lo = 0, hi = n−1: ответ может быть где угодно.

  2. 02

    Смотрим середину

    mid = ⌊(lo+hi)/2⌋. Сравниваем arr[mid] с целью.

  3. 03

    Выбрасываем половину

    Цель больше — двигаем lo вправо от mid. Меньше — hi влево от mid.

  4. 04

    Повторяем

    Каждая итерация удваивает «плотность» поиска: зона сжимается экспоненциально.

  5. 05

    Стоп

    lo > hi — зона пуста, значения нет. Или arr[mid] = цель — индекс найден.

Complexity и ограничения

time
O(log n)
space
O(1)

Массив обязан быть отсортирован. Работает на любых сравнимых данных (числа, строки — по порядку).

Edge cases

  • Пустой массив

    lo > hi сразу — возвращаем −1, ни одного сравнения.

  • Цель меньше/больше всех

    Зона съедается с одной стороны за log n шагов.

  • Дубликаты

    Классическая реализация возвращает любой из подходящих индексов.

Где встречается в реальности

Git bisect

Поиск коммита, сломавшего сборку: checkout середины истории, log n переборов вместо полного прохода.

Индексы БД

B-tree устроен как многоуровневый бинарный поиск: поиск строки по индексу — единицы дисковых страниц.

Словарь

Человек ищет слово в бумажном словаре примерно так же: открывает середину и решает, в какую сторону листать.

Связанные алгоритмы

Shorts

«Как найти одно число среди миллиона, проверив всего ~20 позиций?»

Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.

Shorts 9:16

Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.

Как найти одно число среди миллиона, проверив всего ~20 позиций?
Нажмите Play
Бит 1/6 · 0–2 с
Hook: «миллион чисел, 20 проверок»
script-setup.ru/algorithms/binary-search