В проекте, над которым мы работаем, нужна «рейтинговая» система, аналогичная той, что используется в SO. Однако в нашем есть несколько сущностей, которые нужно «пометить» голосом за (только вверх, никогда не вниз, как приращение). Иногда нам нужно будет показать все сущности в порядке их наивысшего рейтинга, независимо от типа сущности, я думаю, в основном смешивая наборы результатов. Какие структуры данных / алгоритмы вы используете для реализации этого, чтобы они были гибкими и по-прежнему масштабируемыми?





Поскольку алгоритм ранжирования Reddit потрясающий, имеет смысл взглянуть на него, если не скопировать:
Учитывая время публикации записи A и время 7:46:43 8 декабря 2005 г. B, мы имеем ts как их разницу в секундах:
ts = А - В
и x как разность между количеством голосов "за" U и числом голосов "против" D:
х = U - D
Где
y = 1 if x > 0
y = 0 if x = 0
y = -1 if x < 0
и z как максимальное значение модуля x и 1:
z = |x| if |x| >= 1
z = 1 if |x| < 1
у нас есть рейтинг как функция ƒ (ts, y, z):
ƒ (ts, y, z) = log10 z + (y • ts) / 45000