用户匹配算法

时间:2015-07-28 05:32:42

标签: algorithm redis

所以这个问题我们有用户与其他在线用户匹配。然而,这不仅仅是一对一的比赛。向用户提供可供选择的5个其他用户的选择,然后将其标记为已看到,并且当用户请求显示另外5个用户时不应再次显示该用户。在此过程中,更多人可以上网。

问题是,我想让每个用户在其他用户的选择中显示一种方式,使用redis但算法主要是我正在寻找的。我试图以尽可能最快的方式实现这一点,如果可能的话使用redis,但如果需要,我也可以调用数据库。

我目前的解决方案如下,希望有人可以从O(N)电话中获得一些提示来改善这一点。

因此,每个用户都需要拥有看到的 user_id套。我们可以拥有onlineusers的redis列表(队列)。我们一直在向左侧弹出用户,直到我们找到用户的集中的用户,然后保存,添加给看到的用户,然后将其推送到右侧。然后,一旦我们得到其中的5个,我们就会把那些已经看到的那些弹出的东西推回去。

这是我能想到的最好的,但是每次我们想要找到5个用户供这个用户选择时,它是O(N)。可能(尽管不太可能)用户已经看到了大量并且正在弹出整个列表。

帮助更好地理解这一点。一种简单的方法是让每个用户都以一组形式包含所有在线用户的副本。那么我们简单地弹出5个随机集成员。但这不起作用,因为没有足够的空间,每次用户上线时,他们都必须添加到每个用户的在线用户。或者当他们离线时删除,并且这些操作是O(N),考虑到他们是在O(1)

的N个用户完成的

有没有人有任何提示可以将用户与其他用户匹配?

1 个答案:

答案 0 :(得分:1)

了解我们正在谈论的数据类型会很好。有多少用户?平均有多少人在线? "看到的用户和#34;的比例如何?与所有用户(稀疏与密集)相比?

修改算法 不要弹出第一个但是从在线用户集中选择一个随机元素。这应该改善平衡,并可能有助于摊销复杂性,具体取决于这两组的比例!

替代算法(结构更合理;最差情况仍然不好;如果稀疏,应该会很好)

  • 看作作为平衡树(O(log n)插入)
  • 在线保存为平衡树。
  • 虽然没有足够的用户选择:
    • 中找到中的第一个空白(例如[0,1,3,7] - > 2; O(log n)根据SO-link
    • 搜索第一个用户> = gap-value(O(log n))
    • 如果用户< next_gap_neighbor(在上面的示例中:3;在选择的间隙2之后的下一个值)
    • - >挑
    • 否则
    • - >暂时添加selected-gap-value (目前为止;模型决策更新在线的频率)或以某种方式限制搜索&gt ;选择间隙值(O(log n))

根据数据的不同,如果数据很大并且看到稀疏,这应该会非常好用!