Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 用户匹配算法_Algorithm_Redis - Fatal编程技术网

Algorithm 用户匹配算法

Algorithm 用户匹配算法,algorithm,redis,Algorithm,Redis,所以这个问题我们有用户匹配到其他在线用户。然而,这不仅仅是一对一的比赛。一个用户可以从5个其他用户中进行选择,然后将这些用户标记为已看到,当用户请求显示另外5个用户时,不应再次显示。在此过程中,更多的人可以上网 问题是,我希望通过redis,每个用户都能在其他用户的选择中显示出来,但我所寻找的主要是一种算法。我正试图以最快的方式实现这一点,如果可能的话使用redis,但如果需要的话,我也可以调用数据库 我目前的解决方案如下,希望有人能从O(N)调用中得到一些改进 因此,每个用户都需要一组可见的u

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

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

我目前的解决方案如下,希望有人能从O(N)调用中得到一些改进

因此,每个用户都需要一组可见的
user\u id
s。我们可以有一个包含
在线用户的redis列表(队列)
。在这里,我们不断从左侧弹出用户,直到找到一个不在用户看到的集合中的用户,保存它,添加到看到的用户,然后将其推到右侧。然后,一旦我们得到5个我们留下的,推回我们留下的,已经看到的弹出

这是我能想到的最好的方法,但是每次我们想找到5个用户供这一个用户选择时,它都是O(N)。有可能(尽管不太可能)用户看到了大量内容,并从整个列表中弹出

为了更好地理解这一点。一种有效的方法是让每个用户都以集合的形式包含所有在线用户的副本。然后我们只需弹出5个随机集成员。但这不起作用,因为没有足够的空间,而且每次用户上网时,都必须将其添加到每个用户的在线用户中。或在脱机时删除,并且这些操作是O(N),因为它们是在O(1)为N个用户完成的


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

最好知道我们讨论的是哪种数据。有多少用户?平均有多少人会在线?“可见用户”与所有用户(稀疏用户与密集用户)的比例如何

修改算法 不要弹出第一个,而是从在线用户集中选择一个随机元素。这将改善平衡,并可能有助于根据这两组数据的比率分摊复杂度

替代算法(更结构化;最坏情况仍然很糟糕;如果看到稀疏,应该很好)

  • 保持被视为平衡树(O(logn)插入)
  • 保持在线平衡
  • 虽然没有选择足够的用户:
    • 搜索SEED中的第一个间隙(例如,[0,1,3,7]>2;O(对数n)根据)
    • 搜索第一个用户>=间隙值(O(log n))
    • 如果用户
    • ->挑
    • 否则
    • ->临时添加所选间隙值(此时,模型决定在线更新的频率)以查看或以某种方式将搜索限制为>所选间隙值(O(logn))

根据数据的不同,如果数据量很大,而且所看到的数据很少,那么这种方法应该可以很好地工作

答:每次可能有20个用户,而不是5个(如果经常查看大量用户,那么这可能会降低间接成本)。听起来你需要(在最坏的情况下)检查所有(在线)用户列表,所以在任何情况下都是
O(n)
。C.为了加快速度,您可以在查看当前5的同时获得下一个5。在某些情况下,这可能是浪费,但会提供更好的用户体验。@shapiro.yaacov我希望每次你想获得5个以上的用户时不会是O(N)。我正在设计一种方法,用一组按用户id排序的所有用户id,每个用户都保存一个他们在哪里的索引。所以在每次通话中,他们只是从那里恢复到一个他们从未见过的新的人,直到他们循环返回开始。这将是在该索引处恢复的初始O(日志N)。我放弃了这个想法,因为我想不出如何平均分配它。我本想从一个随机索引开始每个用户,但我担心集合总是在末尾或中间增长,被过度访问。@shapiro.yaacov现在我将使用这个选项进行优化,看看我是否能让它工作,直到我想到更好的方法为止谢谢你的回答。一次平均会有5000个用户在线,但是如果这个数字增加到50000甚至100000,我真的很想处理扩展。在平均5000人的情况下,一个用户平均会看到200人,最多500人左右。所以,是的,数据是巨大的,看到的是稀疏的,我一定会看看你写的要点,因为搜索树增加了一些开销,需要大量的数据才有价值。一个著名的例子:。稀疏性是分析随机算法的一个重要因素。在您的情况下,我会假设,就简单性和实用性能而言,没有什么能打败随机算法(只需选择一个随机用户;检查是否正确;继续)(将有更快的方法,更难实现;例如,合并bloom过滤器)!如果我从onlineusers集中弹出一个随机用户。这很好,因为它在redis中是一个O(1)操作。然而,与列表不同的是,它会仔细检查每个用户的列表并重复,我不确定每个用户是否会在选择中得到均匀的用户分布。每个用户都会看到自己的一组
,所以当我随机弹出20个用户,然后删除用户已经看到的用户时,我不知道在我得到的这些剩余用户中,有些可能会被选中很多次,有些则永远不会。关于这里的分布有什么想法吗?或者它值得冒险吗?我不理解这个问题。每个用户都有他“看到”的数据。每个用户的挑选将是5个新用户的一部分,是统一分布的。如果所有用户都一直在线->在每个用户看到的数据中挑选的用户将是完美的