采访傻瓜:朋友的朋友

时间:2013-08-14 00:55:01

标签: algorithm data-structures graph scalability

假设您拥有一个拥有十亿用户的社交网络。在每个用户的页面上,您希望显示用户朋友,朋友的朋友等的数量,达到五度。友谊是互惠的。计数不需要立即更新,但它们应该是准确的。

我读到了图表,但我没有发现任何暗示这个问题的可扩展方法。我能想到的任何东西都会占用太多时间,太多空间或两者兼而有之。这让我疯了!

2 个答案:

答案 0 :(得分:4)

一种有趣的方法是将朋友图转换为邻接矩阵,然后将矩阵提升到第5次幂。这为您提供了一个邻接矩阵,其中包含每个节点之间的长度为5的路径数。

请注意,您需要一种可以利用稀疏矩阵的矩阵乘法算法,因为朋友邻接矩阵在前几个级别可能很稀疏。幸运的是,人们已经做了大量有关如何有效地增加巨大矩阵(特别是稀疏矩阵)的工作。

这是一个video where Twitter's Oscar Boykin mentions this approach用于计算Twitter上关注者的追随者。

答案 1 :(得分:0)

在我看来,问题实际上归结为我们如何散列/跟踪10亿用户,因为我们在计算每个级别的朋友。 (请注意,我们只需要计算它们,而不是存储它们)

如果我们假设对于每个人,他们的朋友和他们朋友的朋友的订单非常小(例如<1000和<100,000),那么将这些存储在每个用户的数据库表中似乎是可行的。它只需要两个可管理的整个数据库传递,然后在创建“新”关系时直接添加到表中。

如果我们将第一和第二学位的朋友存储在用户表中,我们可以根据需要扩展这些朋友 -

EG:对于COUNT三级朋友,我们需要哈希并跟踪所有二级朋友的一级朋友。 (对于4度,你可以完成所有2秒的秒数,对于更高的学位,你创造第4个,然后适当地延伸到第5或第6个)。

所以,在那时(5和6度朋友),你开始接近10亿,作为你需要跟踪,哈希和计数的人数。

我认为问题就变成了,当你“计算”高阶关系中的朋友时,拥有10亿条记录ID的最有效方法是什么。

你怎么做,我不知道 - 有什么想法吗?