用于查找节点是否可从另一节点到达的算法

时间:2012-10-31 06:09:29

标签: algorithm data-structures graph social-networking

我有一个包含数百万个节点的大图。我想检查节点'A'是否可以从节点'B'到达,少于4跳。如果可能的话,我想要最短的路径。哪个是解决此问题的最佳方法(或算法)?

3 个答案:

答案 0 :(得分:7)

请注意,如果图表未加权(正如您的问题中所示) - 一个简单而有效的BFS就足以找到从源到目标的最短路径。

此外,由于您拥有单一来源和单一目标,因此您可以应用 bi-directional BFS ,这比BFS更有效。

算法构思:同时从源和目标进行BFS搜索:[BFS直到两者中的深度1,直到两者中的深度2,....]。
当你找到一个顶点v时,算法将结束,它位于BFS的前面。

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

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

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


(*)双向搜索的解释取自another answer I posted

答案 1 :(得分:3)

在图中两个节点之间找到最短路径的最佳算法,其中没有关于一个节点接近目标的可能性的额外信息是Dijkstra's Algorithm。您可以轻松修改此算法以在3跳后退出,以避免在您不感兴趣的结果上浪费计算。

如果您确实有一些关于给定节点接近目标的可能性的额外信息,您可以使用A* search,它在节点到目标的距离上使用启发式方法来提高其运行时性能。 / p>

答案 2 :(得分:1)

如果您需要小于3跳的路径,则所有可能的路径是A(A = B),A-B(节点是相邻的),A-X-B(X是与两端相邻的节点)。所以没有必要使用任何复杂的算法。首先,测试A = B,第二,测试A和B是否相邻,第三,尝试找到与A和B相邻的X(例如,端点邻接集的相互关系)。