Съемка дизайна высокого уровня.
Есть только две причины, по которым оценка пользователя изменится:
- Пользователь выполнил какое-то действие; или
- Прошла единица времени.
Взаимодействие времени приводит к линейному затуханию † .
Алгоритм
Вы пытаетесь ранжировать пользователей на основе оценки, полученной из их вклада в Действия A, B и C. Давайте начнем с описания того, что будет делать программное обеспечение, когда происходит одна из двух причин изменения оценки.
Когда пользователь выполняет действие: Создайте оценки пользователя за оставшееся время, предполагая, что пользователь больше не будет совершать никаких действий, и поместите их в очередь в объекте пользователя. Передняя часть очереди сообщит текущую оценку пользователя.
Когда проходит единица времени: Просто снимите фронт с очереди очков.
Структуры данных
Мне кажется, что традиционные структуры данных - массивы, деревья, хэш-карты - и даже обычные структуры дополненных данных - связная хэш-карта, красное черное дерево - не будут достаточными для вычисления ранга для такой модели оценки. Вам нужно будет поднять уровень вверх, чтобы получить правильную структуру данных для получения рейтинга из этой системы оценки.
Я могу представить себе хэш-карту с двойными связями. Выглядело бы примерно так:
![Multi-augmented Data Structure](https://i.stack.imgur.com/HWXt0.jpg)
Итак, на приведенной выше диаграмме у нас есть одно общее хранилище, содержащее все пользовательские объекты. Затем у нас есть несколько однократно / двусвязных индексов в хранилище пользователя Таким образом, все индексы, связанные с объектом пользователя, будут обновляться при изменении оценки пользователя.
Наконец, можно разрешить ранжирование не обязательно начиная с 1. Sorted-concurrent-hashmap может быть обновлено и может содержать отрицательные ранги. Поскольку карта отсортирована, самый отрицательный ранг будет первым рангом, и дальнейшие ранги могут быть получены путем прохождения отсортированной карты. Ранги можно нормализовать, чтобы они начинались с некоторого высокого положительного числа, когда минимальный ранг приближается к пределу недостаточного потока.
Это довольно большая проблема. Есть еще много идей и оптимизаций, которые я имею в виду. Это слишком большая задача, чтобы упомянуть их всех здесь. Если у вас есть конкретный вопрос, я могу попытаться ответить на него.
† Взаимодействие времени приводит к линейному затуханию. Таким образом, я предполагаю, что вычислить время, затрачиваемое на оценку от текущей оценки пользователя до следующей (скажем, 100), очень просто. Сколько будущих баллов нужно рассчитать, будет зависеть от того, что вы считаете одной единицей времени.