【问题标题】:Interview stumper: friends of friends of friends采访障碍:朋友的朋友的朋友
【发布时间】: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


【解决方案1】:

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

如果我们假设对于每个人,他们的朋友和他们朋友的朋友的顺序非常小(例如

如果我们将 1 级和 2 级朋友存储在用户表中,我们可以利用它们来扩展我们需要的范围 -

EG:要计算 3 级朋友,我们需要散列和跟踪所有 2 级朋友的 1 级朋友。 (对于第 4 度,您执行所有 2 秒,对于更高的度,您创建第 4 度,然后适当地扩展到第 5 或第 6 度)。

因此,到那时(5 度和 6 度的朋友),您开始接近 10 亿作为您需要跟踪、散列和计数的人数。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这会多算朋友的朋友吗?假设 A 有朋友 B 和 C,他们都是 D 的朋友。A 有两个朋友,但有一个朋友的朋友。
    • 啊,为了避免这个问题,您需要在每次乘法后将每个非零矩阵条目减少到一个。
    • 当你说“一个简单的广度优先搜索将花费 O(n^3) 只为朋友的朋友”时,n 是图的大小吗?
    • 我认为任何合理的方法都必须假设一个超稀疏图。我唯一不喜欢的是它一口气完成了整个计算。当需要显示主页时,可以按需运行 BFS。
    • 你是怎么想出O(n^3)的?即使是天真的 bfs 最多也不需要超过O(E) = O(n^2)。将其与 strassen 的 O(n^2.8) 和 Coppersmith-winograd 的 O(n^2.38) 进行比较。
    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多