如何编写一个可以在两个用户之间返回社交“距离”的高效算法。
例如,当您访问LinkedIn上的个人资料时,您可以看到您与用户之间的距离。
- >用户A是用户B的朋友 - 而B是C的朋友,当A访问C时(距离为1)
图表很大,所以我想知道如何快速执行。
我知道这个问题可能会被关闭,但我认为这是一个编程/算法问题 - 我不会指定任何语言,因为我对这个概念感兴趣。
答案 0 :(得分:16)
假设您没有任何关于目标距离的heuristic function,那么有效的最佳解决方案是bi-directional BFS:
算法思路:同时从源和目标进行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)
顶点。
对于大B和k,第二个显然比第一个好得多。
修改强>
注意,这个解决方案不需要将整个图形存储在内存中,它只需要实现一个函数:successor(v)
它返回一个顶点的所有后继[你可以在一步内获得所有顶点]来自v]。这样,只应存储您打开[2 + 2B + ... + 2B^(k/2)
的节点,如上所述]。为了进一步节省内存,您可以从一个方向使用Iterative Deepening DFS,而不是BFS,但会消耗更多时间。
答案 1 :(得分:2)
我原以为这可以通过将最短路径算法(例如breadth first search)应用于graph database来完成。但他们似乎将整个图表存储在内存中,至少根据this。
我确信算法最终归结为图形结构(节点和边缘)上的某种形式的最短路径。
编辑:根据评论更改算法。
答案 2 :(得分:0)
首先需要填充图表。我不能说你如何从链接中获取图形,可能是节点的BFS或DFS,发现图形,并建立链接。要找到任何两个最佳距离,最好是从源节点创建BFS,并在找到目标时停止。如果你不暗示别的东西,链接没有权重。
在这种情况下,当源节点不同时,您需要应用每个BFS来查找每对之间的距离。否则,您可以实现Floyd Warshall算法以获取所有目标最短路径的所有源,并且因为每个链接具有相同的权重,所以它将获得您想要的。在这种情况下,一旦形成结构,对于任何源和目的地,可以找到最短距离。一个问题是网络总是在变化,因此需要重新处理。因此BFS我认为会很好。
为了加快处理速度,您可以实现BFS并行运行。看看Design and analysis of a nondeterministic parallel breadth-first search algorithm