0

У меня есть список контента с разными категориями, а также со временем создания и, возможно, временем истечения, которое меняется с течением времени (новые элементы добавляются к нему), у меня также есть много пользователей с разными предпочтениями. Теперь я хочу показать это новое содержание пользователей каждый раз, когда они спрашивают об этом, без дублирования, но также с некоторой степенью случайности. Очевидно, что я не могу сохранить все показанное содержимое пользователю и каждый раз проверять весь набор. Одним из возможных решений является использование некоторых кластеров и назначение каждого пользователя кластеру и сохранение некоторых данных для каждого кластера, но я думаю, что есть лучший способ.Как случайным образом выбирать новые элементы из списка элементов расширения для каждого пользователя?

Редактировать: ОК, задав тот же вопрос у моих коллег, они предложили «Bloom Filters», с кем с ними согласен?

ответ

0

Для каждого пользователя есть очередь приоритетов для показа товаров. Каждый раз, когда элемент создается, вставляйте его в очередь приоритетов каждого заинтересованного пользователя с рандомизированным приоритетом. Когда пользователь смотрит на него, удалите верхний элемент из очереди приоритетов, пока не найдете тот, который не истек. Все операции пользователя будут иметь время O(log(n)), которое должно быть приемлемым.

+0

Это хорошее решение для ограниченного числа пользователей или контента, но у меня есть миллионы пользователей, миллионы контента (с тысячами категорий), и каждый пользователь имеет десятки интересов; Я думаю, что накладные расходы вашего решения слишком много, не так ли? – Separius

+0

Что вы делаете в этом случае - пользователи карт на машинах, и каждая машина отслеживает, что ей нужно. Также есть оптимизация вокруг вставки вещей в очередь приоритетов для каждого пользователя только в последнюю минуту. Но в конце концов вы пытаетесь решить ту же инфраструктурную проблему, что и в Twitter, и это будет трудно по тем же причинам, что и для них. – btilly