查找图中两个节点之间的分离度的有效方法

时间:2013-03-09 22:26:01

标签: algorithm graph

这是我最近在互联网上发现的一个访谈问题:

你如何在Facebook上找到两个人之间的分离程度?讨论不同的想法,算法和权衡。 (saparation程度的定义:http://en.wikipedia.org/wiki/Six_degrees_of_separation

以下是我对此的看法:

我能想到的候选算法是:广度优先搜索(BFS),深度优先搜索(DFS),深度限制搜索(DLS),迭代加深搜索(IDS)。

首先,应考虑DFS。很可能即使连接两个人(即分离度= 1),算法也可能长时间沿错误的路径搜索。

保证BFS找到最小分离度(因为图表未加权)。假设最大分支因子为b,两个目标人之间的实际分离度为d,时间复杂度和空间复杂度均为O(b ^ d)。

由于最大可能的分离程度未知(尽管它不应该高于6),因此使用DLS可能不是一个好主意。然而,IDS似乎比BFS更好 - 它的时间复杂度也是O(b ^ d)(尽管由于重复访问中间节点,实际时间成本比BFS略高),而其空间复杂度为O( bd),这比O(b ^ d)好很多。

毕竟,我会选择IDS。这在面试中是否可以接受?我在上述推论中是否有任何错误?或者有没有我错过的更好的解决方案?

提前致谢。

2 个答案:

答案 0 :(得分:10)

更好的解决方案可能是同时从两个节点启动BFS。像下面的伪代码:

nodes1 = (A);
nodes2 = (B);
d = 1;
loop {
    nodes1 = neighbors(nodes1);
    if (intersects(nodes1, nodes2)) {
        return d;
    }
    d += 1;
    nodes2 = neighbors(nodes2);
    if (intersects(nodes2, nodes1)) {
        return d;
    }
    d += 1;
}

此算法的时间复杂度约为O(m ^ (d/2)),其中m是所有节点的最大度数,d是最大距离。与具有O(m ^ d)的简单BFS相比,在大图中可以快得多。

答案 1 :(得分:1)

如果您正在寻找两个特定人之间的分离程度,我会使用Dijkstra's algorithm,它会找到从所选源到所有可到达节点的最短路径。