如何解决如何找到图中两个节点之间的所有路径,直到指定数量的中间节点?
| 我有一个巨大的有向图,有大约一百万个节点和一千万个以上的边。边缘未加权。该图是一个类似小世界的图。实际上,我看到每个节点(平均)连接到三个中间节点上的另一个节点。 给定该图,您可以想到一种快速算法,该算法返回起始节点和目标节点之间的所有路径(无周期),但最多返回给定的最大数量的中间节点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
完成后,别忘了清理桌子!将所有操作作为一项事务处理并回滚可能是最简单的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。