Встреча посередине
Уменьшайте показатель степени, разделяя поиск пополам
«Встреча посередине» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.
Когда полный перебор слишком медленный
В некоторых задачах N примерно равно 40, и перебрать все 2^N подмножеств невозможно. Метод встречи посередине спасает в таких задачах среднего размера. 🤝
Основная идея
Разделите входные данные на две половины. Решите задачу для каждой половины полным перебором, а затем хитро объедините два частичных результата.
Уменьшаем показатель степени вдвое
Для двух половин размера N/2 требуется по 2^(N/2) вариантов вместо общих 2^N. Такое сокращение до квадратного корня превращает 2^40 в вполне удобные 2^20.
Классическая задача: сумма подмножества
Нужно определить, существует ли подмножество с суммой, равной целевому значению T. Сумма подмножества при N около 40 — учебный пример для метода встречи посередине.
Перебираем первую половину
Перечислите все суммы подмножеств из левой половины и сохраните их. При N/2 элементах это всего 2^(N/2) сумм.
from itertools import combinations
left = arr[:len(arr)//2]
sums_l = []Перебираем вторую половину
Сделайте то же самое для правой половины, построив полный список её сумм подмножеств. Теперь у Вас есть два списка приемлемого размера.
Объединяем результаты поиском
Для каждой правой суммы r нужна левая сумма, равная T минус r. Множество или отсортированный список позволяют быстро выполнить такую проверку.
need = T - r
found = need in left_setДва способа сопоставления
Для точных целей используйте хеш-множество. Для подсчёта или поиска ближайших сумм отсортируйте одну половину и выполните двоичный поиск по ней.
Затраты времени
Общий объём работы составляет примерно 2^(N/2), умноженное на логарифмический множитель для поиска или сортировки. Именно эта сложность делает выполнимыми задачи с N около 40.
Компромисс по памяти
Вы храните одну половину целиком, поэтому объём памяти растёт до 2^(N/2). Храните только необходимое, чтобы уложиться в ограничение.
Другие области применения
Помимо суммы подмножества, используйте этот метод для поиска максимального подмножества с ограничением, подсчёта пар и задач в стиле дискретного логарифма. Он особенно хорош при аккуратном разделении.
Быстрая проверка
Вы применяете метод встречи посередине к задаче о подмножестве с N элементами. Какова примерная временная сложность?
Итоги
Разделите задачу на две половины, выполните полный перебор каждой, а затем сопоставьте левые и правые суммы. Вы обменяли небольшое увеличение расхода памяти на огромное ускорение. 🚀
Часто задаваемые вопросы
Урок «Встреча посередине» бесплатный?
Да — полный текст урока «Встреча посередине» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «Встреча посередине»?
Уменьшайте показатель степени, разделяя поиск пополам Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Coding Interview Prep?
Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Встреча посередине»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Coding Interview Prep?
Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Выигрышные и проигрышные состояния в играх
- Ним и число Гранди
- Встреча посередине
- Быстрая отладка: стресс-тесты и сортировка ошибок