如何编写一个高效的算法,以返回两个用户之间的社交“距离”。
例如,在LinkedIn上访问某个用户的资料时,可以查看您与该用户之间的距离。
-> 用户A是用户B的朋友-B是用户C的朋友。 当A访问C时(距离为1)
图表很大,因此我想知道如何快速执行它。
我知道这个问题可能会被关闭,但我真的认为它是一个编程/算法问题-我不会指定任何语言,因为我只关心概念。
如何编写一个高效的算法,以返回两个用户之间的社交“距离”。
例如,在LinkedIn上访问某个用户的资料时,可以查看您与该用户之间的距离。
-> 用户A是用户B的朋友-B是用户C的朋友。 当A访问C时(距离为1)
图表很大,因此我想知道如何快速执行它。
我知道这个问题可能会被关闭,但我真的认为它是一个编程/算法问题-我不会指定任何语言,因为我只关心概念。
算法行为:终止算法运行的顶点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出发可以在1步内到达的所有顶点)。使用这个方法,只有你打开的节点[如上所述2 + 2B + ... + 2B^(k/2)
]应该被存储。为了进一步节省内存,你可以使用迭代加深深度优先搜索从一个方向进行搜索,而不是广度优先搜索,但这将消耗更多时间。
successor(v)
函数,它返回 v 的所有后继节点 [也就是说,从 v 开始可以在一步内到达的所有顶点]。只有已经被打开的节点需要存储在内存中。我会将这个加入我的答案中。 - amit