0Pricing
Competitive Programming Academy · Урок

Встреча посередине

Уменьшайте показатель степени, разделяя поиск пополам

«Встреча посередине» — бесплатный урок Competitive Programming Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Competitive Programming Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Competitive Programming Academy содержит 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) и разблокировать остальной курс Competitive Programming Academy, подпишись на CoddyKit PRO. Курс Competitive Programming Academy содержит 4 уроков всего.

Чему я научусь в уроке «Встреча посередине»?

Уменьшайте показатель степени, разделяя поиск пополам Ты практикуешь Competitive Programming Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Competitive Programming Academy?

Предыдущий опыт не требуется. Competitive Programming Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Встреча посередине»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Competitive Programming Academy?

Да. Каждый урок Competitive Programming Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Выигрышные и проигрышные состояния в играх
  2. Ним и число Гранди
  3. Встреча посередине
  4. Быстрая отладка: стресс-тесты и сортировка ошибок
← Назад к Competitive Programming Academy