Как найти элемент быстро — и почему сортировка ускоряет поиск.
⏱️ ~30 мин·Средний·📚 2 урока
Линейный поиск
Самый простой способ найти элемент в спискеИзменяемая упорядоченная коллекция элементов: [1, 2, 3]. По-английски list. — пройти его по порядку и сравнивать каждый элемент с искомым. Это линейный поиск. Он работает на любом списке, даже неотсортированном, но в худшем случае придётся просмотреть все элементы.
▶ linear.py
Принято возвращать индексНомер позиции элемента в последовательности. В Python нумерация с нуля: первый элемент — индекс 0. найденного элемента, а если элемента нет — особое значение -1 (такого индекса не бывает у обычного списка). ФункцияИменованный блок кода, который можно вызывать многократно. Может принимать аргументы и возвращать результат.enumerate даёт сразу индекс и значение.
Бинарный поиск — поиск в отсортированном списке
Если список уже отсортирован, можно искать гораздо быстрее. Вспомните, как ищут слово в словареКоллекция пар «ключ → значение»: {"a": 1}. Быстрый доступ по ключу. По-английски dict.: открывают примерно посередине, смотрят, в какой половине нужное слово, и отбрасывают вторую половину. Бинарный поиск делает то же самое: каждый шаг вдвое сокращает зону поиска.
▶ binary.py
⚠️Осторожно
Бинарный поиск работает только на отсортированном списке! Если подать ему неупорядоченные данные, он будет отбрасывать «не ту» половину и пропустит элемент. Перед бинарным поиском данные обязательно должны быть отсортированы.
💡Совет
Почему это так быстро. Линейный поиск в списке из миллиона элементов в худшем случае делает миллион сравнений. Бинарный — около 20 (каждый шаг делит пополам: 2²⁰ ≈ миллион). Это разница между «мгновенно» и «заметно». На языке оценок: линейный — O(n), бинарный — O(log n).
💡Совет
Предскажите вывод. В отсортированном списке [2, 4, 6, 8, 10] ищем число 8 бинарным поиском. Какой индекс вернётся? Посчитайте, какие mid будут проверяться.
▶ predict-binary.py
Вернётся 3. Шаги: mid=2 (значение 6, меньше 8 → идём вправо, low=3), затем mid=3 (значение 8 — нашли). Всего два сравнения вместо четырёх у линейного поиска.
⚠️ Частые ошибки новичков
Ошибка. Забыть обновить границы и написать low = mid вместо low = mid + 1. Тогда при неудачном сравнении зона поиска перестаёт сужаться и циклКонструкция, повторяющая блок кода: for перебирает элементы, while — пока условие истинно. зацикливается навсегда. Запустите сломанный код — он зависнет (прервите его). Почините: сдвигайте границу за mid.
▶ broken-binary.py
Заданиерешение.py
Напишите функцию linear_search(items, target), возвращающую индекс первого вхождения target в списке или -1, если элемента нет.
Заданиерешение.py
Напишите функцию binary_search(items, target) для отсортированного списка. Верните индекс target или -1.
❓Проверь себя
Какое обязательное условие для бинарного поиска?
Сколько примерно сравнений делает бинарный поиск в списке из 1 000 000 элементов?
Что обычно возвращают, если элемент не найден?
ℹ️Важно
✅ Что вы узнали
Линейный поиск проходит список по порядку — работает всегда, O(n).
Бинарный поиск делит диапазон пополам — только для отсортированных, O(log n).
Отсутствие элемента принято обозначать индексом -1.
Границы в бинарном поиске сдвигаются за mid (+1/-1).
Комментарии
Загрузка…
Загрузка комментариев…