|
|
1
1
您作为答案发布的代码不正确。通过将计数存储在散列中,您将忘记许多用户,因为每个总数只保留一个用户。例如,如果两个用户具有相同的兴趣(或者至少与当前用户具有相同数量的匹配兴趣),则
顺便说一句,你可以通过调换
|
|
2
1
你所说的叫做集群。 集群是一个困难的问题,动态计算它需要的资源恐怕比我们希望的要多,因为一个完整的计算是O(N) 2
但是,我可以找出如何缓存结果!
(一个索引用于UserId,另一个索引用于LinkedUserId,unicity的限制是不应该有两行具有相同的UserId/LinkedUserId对) 无论何时需要获取此用户的组,请首先查阅缓存表。 现在,我们还需要不时地使一些缓存条目无效:每次用户添加或删除一个兴趣,那么它就可能影响所有链接到她的用户。
老实说,我不确定它会表现得更好。 |
|
|
3
1
如果你建立了很好的索引,你应该很好。 |
|
|
4
1
首先,我创建一个二维数组,其中每列是一个用户,每行是一个兴趣点。数组中的每个值都是0或1,具体取决于当前用户是否感兴趣。此数组存储在内存中,并带有用于添加或修改行和列的函数。 然后,当我想计算与当前用户兴趣相似的用户时,我将当前用户的列设置为“1”的每一行的所有列相加。这意味着我需要遍历10000列,平均每列运行50个加法操作,最后执行排序操作。 您可能会猜到这需要很长时间,但实际上在我的机器上大约需要50-70毫秒(core2duo,3ghz)。Ruby 1.9.1),在我们的生产服务器上大约110毫秒。好在我甚至不需要限制结果集。
前几行用于创建模拟的二维阵列。程序的其余部分运行我上面描述的算法。 上述算法在一段时间内可以很好地扩展。显然,它不适合50000多个用户,但是由于我们的产品将社区划分为更小的组,这种方法工作得非常好(而且比SQL快得多)。 任何关于如何调整它以获得更好性能的建议都是欢迎的。 |