Все темы
84

Топ-10 из миллиарда, без сортировки миллиарда

Tier 1Закрыто

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

1. Задача

Мимо идёт поток событий: поисковые запросы, ошибки из логов, очки игроков. Тебе нужны 10 наибольших значений. Остальные можно выбросить, а порядок внутри десятки неважен.

Первое, что приходит в голову: собрать всё, отсортировать и взять 10 первых. Это работает, пока данные помещаются в память. Но сортировать миллиард строк ради 10 из них расточительно. А живой поток целиком в памяти и вовсе не удержать.

Тебе в каждый момент нужны только 10 значений. Храни эти 10, а каждое новое значение пусть пробует занять место одного из них. Маленькая куча (heap) делает ровно это.

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

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

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

Как узнать

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

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

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

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

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

На LeetCode

Задачи, где нужны k наибольших, k самых частых или k-й по величине элемент. Держи мин-кучу размером не больше k, её корень будет самым слабым из оставленных, а цена O(n log k).

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