所以这个问题是我们让用户与其他在线用户匹配。然而它不仅仅是一对一的匹配。一个用户会选择5个其他用户,然后标记为已查看并在用户请求展示另外5个用户时不再显示。在此过程中可能会有更多的人上线。
问题是,我希望每个用户都能在其他用户的选择中显示,使用Redis但主要是要一个算法。我正在尝试以最快的方式实现这个,如果可能的话,使用Redis,但如果需要,我也可以调用数据库。
我的当前解决方案如下,希望有人能提供一些从O(N)调用中改进的提示。
所以每个用户都需要一个seen集合的
这是我能想到的最好的方法,但每次我们想要找到5个用户供该用户选择时,它的时间复杂度都是O(N)。这可能(虽然不太可能)会导致用户已经看到了大量内容,并弹出了整个列表。
为了更好地理解这一点。一个天真的做法是让每个用户都包含在线用户集合的副本。然后我们只需随机弹出5个集合成员即可。但这行不通,因为空间不够,每次用户上线时,他们必须被添加到每个用户的在线用户列表中。或者在他们离线时删除,这些操作对于N个用户而言是O(N)。
有人有什么技巧可以将用户与其他用户匹配吗?
问题是,我希望每个用户都能在其他用户的选择中显示,使用Redis但主要是要一个算法。我正在尝试以最快的方式实现这个,如果可能的话,使用Redis,但如果需要,我也可以调用数据库。
我的当前解决方案如下,希望有人能提供一些从O(N)调用中改进的提示。
所以每个用户都需要一个seen集合的
user_id
s。我们可以有一个Redis列表(队列)onlineusers
,从左侧保持弹出用户,直到我们找到一个不在用户seen集合中的用户,保存它,添加到用户已看到的列表中,然后将其推到右侧。然后,一旦我们得到了其中的5个,我们就把那些已经看到的左边弹出的推回去。这是我能想到的最好的方法,但每次我们想要找到5个用户供该用户选择时,它的时间复杂度都是O(N)。这可能(虽然不太可能)会导致用户已经看到了大量内容,并弹出了整个列表。
为了更好地理解这一点。一个天真的做法是让每个用户都包含在线用户集合的副本。然后我们只需随机弹出5个集合成员即可。但这行不通,因为空间不够,每次用户上线时,他们必须被添加到每个用户的在线用户列表中。或者在他们离线时删除,这些操作对于N个用户而言是O(N)。
有人有什么技巧可以将用户与其他用户匹配吗?