如何在两个节点之间查找图表中的所有路径,直到给定数量的中间节点?

时间:2011-05-24 13:10:14

标签: algorithm graph path graph-algorithm

我有一个巨大的有向图,有大约一百万个节点和一千多万个边。边缘没有加权。该图是一个类似小世界的图。事实上,我看到每个节点(平均)通过三个中间节点连接到另一个节点。

鉴于此图,你能想到一个快速算法,它返回起始节点和目标节点之间的所有路径(没有周期),但只能达到给定的最大数量N个中间节点(在我的情况下,N大部分是时间会在0到3之间)?

2 个答案:

答案 0 :(得分:3)

如果您的图表是无向的,您肯定希望进行双向广度优先搜索。对于长度为2的路径,枚举起始节点和结束节点的边并查看它们相交的位置。对于长度为3的路径,从较小程度的终点向深2,在具有较大程度的节点上向深2。

由于您的图表是定向的,您可能还希望保留反向边缘,以便您可以执行相同的操作。

答案 1 :(得分:0)

也许一下子从两个方向先呼吸?拿A的邻居和B.的邻居如果还没找到链接,将A添加到“a的邻居”,将B添加到“B的邻居”,然后找到两个集合之间的任何链接。

为了比三个链接扩展一点,“A / B的邻居”列表需要包含更多内容。您将无法在内存中执行此操作 - 您需要一个带有

的临时表
whatever TRANSACTION_ID; (or use an ORACLE 1-per-session temp table)
boolean MY_BFS_WAS_ROOTED_AT_A;
int NODE_ID;
int previous_node_id;

(如果在insert语句中检查循环,则无需跟踪深度)

当有任何

时,你找到了一条路径
select from pathfinder a, pathfinder b
where a.taxn_id = foo and b.tnx_id=foo
and a.MY_BFS_WAS_ROOTED_AT_A = false
and b.MY_BFS_WAS_ROOTED_AT_A = true
and a.node_id = b.node_id

完成后别忘了清理桌子!将所有操作作为一个事务完成并将其回滚可能是最简单的方法。