【发布时间】:2013-08-15 19:19:39
【问题描述】:
假设您有一个拥有十亿用户的社交网络。在每个用户的页面上,您要显示该用户的好友数、好友的好友数等,最多显示五度。友谊是相互的。计数不需要立即更新,但它们应该是准确的。
我阅读了图表,但没有找到任何建议可扩展解决此问题的方法。我能想到的任何事情都会占用太多时间、太多空间,或者两者兼而有之。这让我发疯了!
【问题讨论】:
-
使用广度优先搜索。 BFS 保证所有度数 1 的朋友在度数 2 之前被搜索到,所有度数 2 的朋友在度数 3 之前被搜索到,以此类推。当您访问每个未发现的朋友时,将其标记为已发现,并将计数加一。有一个变量来跟踪搜索的程度。当所有 5 级的朋友都被拜访过时停止。
-
@JasonL- 在大型社交网络中,这将探索如此大量的节点,这将是非常昂贵的。
-
这是否可以通过一个最初昂贵的全图搜索(可能使用矩阵的东西而不是 BFS)来明智地完成,然后每当添加或删除连接或用户时,你就会去“我的第 k 度朋友是我一级朋友的所有(k-1)级朋友的联合吗?如果您只想列出适用于他们的最小 k,这显然意味着在该 set 操作之后进行一些清理。
-
我想知道这个任务有多可行。假设“6 度分离”并不遥远,这表明对于 5 度,您可以获得整个图表的两位数百分比作为您的 5 度朋友。您将如何为每一个十亿用户管理大量信息?即使只是为每个用户分配一个数字作为他们的 ID 并使用位向量来存储信息,这将需要超过 100 MB 来存储五级朋友,这给我们大约 100 PB 的信息来存储五级朋友所有 10 亿用户。
-
@G.Bach 我认为一个关键是不要计算每个主页的好友,只计算当前显示的好友。
标签: algorithm data-structures graph scalability