Вчера во время технического интервью мне задали следующий вопрос.Перемещение максимального варианта
Представьте, что вы работаете в информационном агентстве. В каждый отдельный момент времени t
, история разбивается. Некоторые истории более интересны, чем другие. Эта «жара» выражается как натуральное число h
, причем большее количество представляет собой более горячие новостные сюжеты.
Учитывая поток S
из n
историй, ваша работа состоит в том, чтобы найти самую горячую историю из самых последних k
истории для каждого t >= k
.
До сих пор так хорошо: это проблема с максимальным перемещением (также известная как проблема с максимальным раздвижным окном), и есть linear-time algorithm, который ее решает.
Теперь вопрос усложняется. Конечно, старые истории, как правило, менее жаркие по сравнению с более новыми историями. Пусть возраст a
из последней истории будет равен нулю, и пусть возраст любой другой истории будет на один больше, чем возраст его последующей истории. Затем «улучшенная жара» истории определяется как max(0, min(h, k - a))
.
Вот пример:
n = 13, k = 4
S indices: 0 1 2 3 4 5 6 7 8 9 10
S values: 1 3 1 7 1 3 9 3 1 3 1
mov max hot indices: 3 3 3 6 6 6 6 9
mov max hot values: 7 7 7 9 9 9 9 3
mov max imp-hot indices: 3 3 5 6 7 7 9 9
mov max imp-hot values: 4 3 3 4 3 3 3 3
Я был в полной растерянности с этим вопросом. Я думал о добавлении индекса к каждому элементу перед вычислением максимума, но это дает вам ответ, когда горячность истории уменьшается на единицу на каждом шаге, независимо от того, достигнет ли она горячей или нет.
Вы можете найти алгоритм для этой проблемы с субквадратичным (идеально: линейным) временем работы?
@MattTimmermans 7 выскочил 1, когда он вошел в deque. –
Спасибо, я получил это - так как значения в deque монотонно уменьшаются, переднее значение всегда является первым, кто достиг своего возраста, и это отлично работает –
Впечатляет! Спасибо! – mwjxhuvj