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

问题描述

| 我有一个巨大的有向图,有大约一百万个节点和一千万个以上的边。边缘未加权。该图是一个类似小世界的图。实际上,我看到每个节点(平均)连接到三个中间节点上的另一个节点。 给定该图,您可以想到一种快速算法,该算法返回起始节点和目标节点之间的所有路径(无周期),但最多返回给定的最大数量的中间节点N(在我的情况下,大多数时间在0和3之间)?     

解决方法

如果您的图形是无向的,则您肯定希望进行双向广度优先搜索。对于长度为2的路径,请枚举起始节点和终止节点的边,并查看它们相交的位置。对于长度为3的路径,以较小的度数从端点深2,然后以较大的度数在节点深1。 由于图形是有向的,因此您可能还希望保留反向边缘,以便执行相同的操作。     ,也许一次从两个方向呼吸优先?以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;
(如果您检查插入语句中的循环,则无需跟踪深度) 您已经找到一条路径
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
完成后,别忘了清理桌子!将所有操作作为一项事务处理并回滚可能是最简单的方法。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...