Если вы действительно хотите сжать это, на ваш случай есть немой/простой подход (показать сверху 1%).
Эта оптимизация может произойти, потому что в среднем только 1 из 100 изменений популярности выбивает один из лучших 1%. (Предполагает случайное распределение обновлений. Конечно, с более типичным распределением степенным, это может произойти гораздо чаще.)
Сортировать весь первоначальный сбор,
- Храните только 10 лучших в любой сортированной структуре данных (например, BST)
- Храните оценку популярности № 10 (например,
minVisiblePopularity
)
затем с каждой последующей изменением популярности в коллекции, сравните с minVisiblePopularity
.
- Если новая популярность падает выше
minVisiblePopularity
, обновить структуру и minVisiblePopularity
топ-10 соответственно.
- (Или, если старая популярность была больше, но новая популярность меньше - например, бывший топ-10 предметов, получающих нокаут).
Это добавляет минимальное требование хранения чрезвычайно малого двоичного дерева поиска (10 единиц) и примитивной переменной. Дереву тогда требуется только обновление, когда изменение популярности выбивает один из предыдущих топ-10.
Поддержание «максимальной кучи». Он должен работать. – Haris
Можете ли вы уточнить? Извините за невежество. – Appy
Какая операция происходит чаще? Изменение порядка или вид сверху-10? Если доминирует представление, вы хотите сохранить элементы в отсортированном порядке (например, BST). Если переупорядочение доминирует, вы можете пойти на дополнительные расходы на топ-10 в обмен на более дешевую операцию переупорядочения (посмотрите на различные реализации макс-кучи). –