Я столкнулся с этой проблемой пару дней назад на собеседовании по проектированию системы.Я опускаю посторонние части, чтобы сосредоточиться на основной части проблемы.Это выглядит примерно так.
Допустим, у нас есть набор пар k, v, ключи являются строками, а значения являются целыми числами.Мы можем предположить, что есть фиксированный набор ключей (например, k1, k2, ..., kn).Есть какой-то агент, который непрерывно выталкивает эти пары k, v в систему, как поток.И все, что нам нужно сделать, это добавить текущее значение к старому значению для всех входящих пар.
Давайте рассмотрим пример.Во время t0
давайте предположим, что у нас есть следующие пары kv.
k1: 100
k3: 200
Во время t1
есть две входящие пары.k2: 50
, k3: 150
.Таким образом, на t1
состояние системы:
k1: 100
k2: 50
k3: 350
Цель состоит в том, чтобы выдать ключ, который имеет максимальное значение через периодический интервал.Я не могу придумать ни одного алгоритма, который дал бы лучшее время выполнения, чем max-heapify.Я думал о создании максимальной кучи, а затем обновлять ее по мере поступления новых данных.Для каждого обновления heapify()
будет занимать максимум log(n)
времени.При каждом вызове мы можем затем вернуть корень кучи.Но есть ли лучшее решение, чем это?