Кажется, что здесь есть две параллельные структуры. Во-первых, вам нужна таблица поиска, которая может отображать идентификаторы в фильмы. Во-вторых, вам нужно поддерживать какую-то очередь с приоритетами, которую можно использовать для отслеживания первой десятки фильмов в целом.
Одним из способов решения этой проблемы было бы просто поддерживать эти две структуры одновременно. Поскольку вы знаете, что у каждого фильма есть встроенный идентификатор, вы можете либо сохранить фильмы в гигантском массиве, либо ожидать, что идентификаторы будут редкими в хеш-таблице. Кроме того, вы можете поддерживать приоритетную очередь (возможно, подкрепленную двоичной или биноминальной кучей), в которой хранятся все фильмы с приоритетом, равным их рейтингу. Это позволит вам определить лучшие десять фильмов, удалив десять элементов из очереди приоритетов и затем вставив их заново.
Однако, чтобы повысить производительность из очереди с приоритетами, я бы предложил использовать слегка измененную структуру очереди, в которой у вас есть массив из десяти лучших фильмов в отсортированном порядке и очередь с приоритетами из всех других фильмов, которые не являются в первой десятке. Всякий раз, когда вы обновляете приоритет фильма, вы можете сделать следующее:
Если фильм входит в десятку лучших, удалите его из этого массива и перетасуйте элементы после него на одно место. Затем вставьте его в очередь приоритетов с новым рейтингом.
В противном случае используйте функцию уменьшения клавиши в приоритетной очереди, чтобы уменьшить ее значение. Если рейтинг теперь выше десятого по популярности фильма в первой десятке списка, удалите этот фильм из первой десятки и вставьте его в очередь с приоритетами. В противном случае мы закончили.
(В этот момент элемент находится в очереди с приоритетами в нужном месте, и в массиве из десяти лучших фильмов содержится девять элементов)
Используйте функцию dequeue-max в очереди с приоритетами, чтобы извлечь наиболее популярный фильм из очереди с приоритетами, а затем с помощью простой сортировки вставок вставить его в массив из десяти самых популярных фильмов.
Общая временная сложность для этого подхода (при условии, что вы используете двоичную или биномиальную кучу) составляет O (k 2 + lg n), где k - количество элементов в списке первой десятки и n - общее количество фильмов. В среднем, он выполняется за O (LG N) времени, так как есть вероятность, что вам не нужно обновлять список первой десятки. В любом случае, поскольку k мало (десять), я бы предположил, что это будет работать очень быстро. Более того, он дает вам O (1) поиск любого из лучших k фильмов, что, я ожидаю, будет довольно распространенной операцией.
Надеюсь, это поможет!