Алгоритм сопоставления пользователей

Таким образом, эта проблема у нас есть пользователи, соответствующие другим онлайн-пользователям. Однако это не просто матч один на один. Пользователю предоставляется выбор из 5 других пользователей на выбор, которые затем помечаются как видимые и не должны отображаться снова, когда пользователь запрашивает еще 5 пользователей для отображения. Все больше людей могут выходить в интернет во время процесса.

Проблема в том, что я хочу, чтобы каждый пользователь отображался в списке выбора для других пользователей с помощью redis, но алгоритм - это в основном то, что я ищу. Я пытаюсь реализовать это как можно быстрее, используя Redis, если это возможно, но я также могу делать вызовы в базу данных, если это необходимо.

Мое текущее решение заключается в следующем, надеюсь, у кого-то будет несколько советов по улучшению этого из O (N) вызовов.

Таким образом, каждый пользователь должен иметьвидели набор изuser_ids. Мы можем иметь список (очередь) повторногоonlineusers, Где мы продолжаем высовывать пользователей слева, пока не найдем того, которого нет у пользователявидели установить, сохранить его, добавить к увиденным пользователям, а затем нажать его справа. Затем, как только мы получим 5 из тех, кого мы оставили, отодвиньте те, которые мы оставили, оторвавшиеся, которые уже были замечены.

Это лучшее, что я могу придумать, однако это O (N) каждый раз, когда мы хотим найти 5 пользователей, из которых этот пользователь может выбирать. Возможно (хотя и маловероятно), что пользователь увидел огромное количество и выталкивает весь список.

Чтобы помочь понять это лучше. Наивный подход заключается в том, чтобы каждый пользователь содержал копию всех онлайн-пользователей в виде набора. Итак, мы просто добавляем 5 случайных членов. Но это не может работать, потому что там недостаточно места, и каждый раз, когда пользователь выходит в сеть, его нужно добавлять к онлайн-пользователям каждого пользователя. Или удаляются, когда они отключаются, и эти операции выполняются за O (N), учитывая, что они выполнены для N пользователей в точке O (1).

У кого-нибудь есть какие-либо советы, чтобы сопоставить пользователей с другими пользователями?

Ответы на вопрос(1)

Ваш ответ на вопрос