Все темы
85

Слияние многих отсортированных потоков в один

Tier 1Закрыто

Где применяется

1. Задача

В прошлых уроках ты построил кучу, и она дёшево отдаёт самый маленький элемент. Теперь первая настоящая задача для неё. У тебя несколько списков, и каждый уже отсортирован. Например, логи с k серверов, каждый по времени. Нужен один общий поток, тоже по времени.

Можно склеить всё в один массив и отсортировать заново. Но тогда готовый порядок внутри списков пропадает зря, а все строки приходится держать в памяти одновременно. Для нескольких огромных потоков это дорого. К тому же первую строку результата нельзя выдать, пока не загружены все.

Лучше идти по общему порядку по одному элементу: каждый раз выдавать наименьшее ещё не выданное значение и смотреть при этом на как можно меньшее число элементов.

Этот шаг из платной части

Бесплатные шаги в начале курса (их 33) открыты всем: урок, задача и тесты. Этот шаг открывается с полным доступом. Начни с бесплатного аккаунта и бесплатных шагов.

Завести бесплатный аккаунтПосмотреть, что входит

Как узнать

Бинарная куча / очередь с приоритетом (Binary heap / priority queue)

Эти слова в условии значат этот паттерн

  • всегда нужен текущий минимум/максимум
  • k наименьших/наибольших элементов
  • слияние k отсортированных списков
  • текущая медиана, пока элементы прибывают
  • очередь с приоритетом / самое срочное следующим

Похоже, но не то

n до 1e6 даёт O(log n) на вставку или снятие. Чтение вершины стоит O(1).

На LeetCode

Задачи, где нужно слить k отсортированных списков или идти по k отсортированным последовательностям одновременно. Держи в мин-куче первый элемент каждого списка, доставай наименьший и клади следующий из того же списка.

Мы используем необходимые куки для работы сайта (вход и язык). Если ты согласишься, мы также загрузим Google Analytics, чтобы видеть, какие страницы читают, и Google reCAPTCHA для защиты форм обратной связи и сообщений об ошибке от спама. Политика конфиденциальности