【问题标题】:Compute social distance between two users计算两个用户之间的社交距离
【发布时间】:2011-08-28 09:59:02
【问题描述】:

您将如何编写一个可以返回两个用户之间的社交“距离”的有效算法。

例如,当您访问 LinkedIn 上的个人资料时,您可以看到您与用户之间的距离。

-> 用户 A 和用户 B 成为朋友 - B 和 C 成为朋友。A 何时访问 C(距离为 1)

图表很大,所以我想知道它是如何执行得这么快的。

我知道这个问题很可能已经结束,但我真的认为这是一个编程/算法问题 - 我不会指定任何语言,因为我对这个概念很感兴趣。

【问题讨论】:

  • 您能否为没有LinkedIn的人提供示例屏幕截图和数据或其他内容?
  • 你指的是大圆距离吗? en.wikipedia.org/wiki/Great-circle_distance
  • @Zirak 你可以看到我的例子,我编辑了帖子

标签: algorithm linkedin


【解决方案1】:

假设你没有任何关于目标距离的heuristic function,那么有效的最佳解决方案是bi-directionalBFS
算法思路:同时从源和目标进行 BFS 搜索:[BFS 直到两者的深度 1,直到两者的深度 2,......]。
当你找到一个顶点 v 时,算法将结束,它在两个 BFS 的前面。

算法行为:终止算法运行的顶点 v 将恰好位于源和目标之间的中间。
在大多数情况下,该算法会产生比源代码中的 BFS 更好的结果 [解释为什么它比 BFS 更好],并且如果存在,肯定会提供答案。

为什么从源头上比 BFS 更好?
假设源到目标的距离为k,分支因子为B[每个顶点都有B条边]。
BFS 将打开:1 + B + B^2 + ... + B^k 顶点。
双向 BFS 将打开:2 + 2B + 2B^2 + 2B^3 + .. + 2B^(k/2) vertices。

对于大的B和k,第二个显然比第一个好很多。

编辑:
注意,此解决方案不需要将整个图形存储在内存中,它只需要实现一个函数:successor(v),它返回一个顶点的所有后继[所有你可以到达的顶点,在 v 的 1 步内] .这样,只有您打开的节点 [2 + 2B + ... + 2B^(k/2) 如上所述] 应该被存储。为了进一步节省内存,你可以从一个方向使用Iterative Deepening DFS,而不是BFS,但是会消耗更多时间。

【讨论】:

  • 是不是也意味着整个图需要在内存中?
  • @JohnJohnGa:不。您所需要的只是一个successor(v) 函数,它返回v 的所有后继[意思是,您可以在一步内从v 到达的所有顶点]。只有打开的节点需要存储在内存中。我会将此添加到我的答案中。
  • 接受,非常好的答案 - 这就是我喜欢 stackoverflow 的原因,我们可以得到包括纯算法在内的所有问题的答案!
  • @JohnJohnGa:谢谢。 p.s.如果您有某种启发式方法,可以尝试ASTar,但我认为您没有。这是查找大型/无限图距离的最佳 [最快] 无信息算法。
【解决方案2】:

我假设这将通过应用最短路径算法来完成,例如将breadth first search 应用于graph database。但他们似乎将整个图表存储在内存中,至少根据this.

我确信该算法最终归结为图结构(节点和边)上某种形式的最短路径。

编辑:根据 cmets 更改了算法。

【讨论】:

  • 是的——这就是为什么当你有大量用户的时候——我真的不知道怎么能做到[这么快]
  • 如果图没有加权,为什么要使用 Dijkstra 算法?我猜只是 BFS :)
  • 您可以在这种情况下使用 Dijkstra,使用 weight = 1。但 BFS 在这种情况下更好。
  • 查看关于Linkedin 架构的最后一个链接。标题为“云”的部分描述了他们如何快速实现这一目标,主要是通过投入大量资金和 RAM 来解决问题。
【解决方案3】:

首先需要填充图表。我不能说你是如何从链接中获取图形的,可能是对节点进行 BFS 或 DFS,发现图形并建立链接。要找到任意两个最佳之间的距离,就是从源节点做一个 BFS 并在找到目的地时停止。我认为,如果您不暗示其他内容,链接没有权重。

在这种情况下,当源节点不同时,您需要分别应用 BFS 来查找每对之间的距离。否则,您可以实现 Floyd Warshall 算法来获取所有源所有目标最短路径,并且因为每个链接具有相同的权重,它会得到您想要的。在这种情况下,一旦构建了结构,对于任何源和目的地,都可以找到最短距离。一个问题是网络总是在变化,因此需要重新处理。因此,我认为 BFS 会很好。

为了加快处理速度,您可以实现 BFS 以并行运行。看看Design and analysis of a nondeterministic parallel breadth-first search algorithm

【讨论】:

    猜你喜欢
    • 2021-05-15
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多