检测Ocaml中具有数百万个节点的有向图中的所有周期

时间:2012-06-24 13:52:44

标签: graph ocaml graph-algorithm

我有数千个节点到数百万个节点的图表。我想在这些图中检测所有可能的周期。

我使用哈希表来存储边缘。 ((源节点,边缘权重) - >(目标节点))。

在OCaml中实现它的有效方法是什么?

看起来Tarjan的算法是最好的算法。

同样的实施方式最多。

2 个答案:

答案 0 :(得分:2)

是的,Tarjan的强连接组件算法是一个很好的解决方案。您也可以使用所谓的path-based强组件算法,这些算法在(仔细完成时)具有可比较的线性复杂度。

如果您选择合理的数据结构,它们应该有效。在实现和分析原型实现之前,很难说更多。

我不明白你的图表表示是什么:你是否真的是(node,weight)夫妻的哈希键?那么如何找到给定节点的所有邻居?对于大型图形结构,您应该优化访问时间,当然还要提高内存效率。

答案 1 :(得分:1)

如果你真的想找到所有可能的周期,那么在最坏的情况下问题似乎至少是指数级的。对于完整的图形,每个非空的节点子集都会为您提供不同的循环(包括从最后一个到第一个循环的链接)。 Forthermore每个子集的每个循环排列都会为您提供不同的循环。根据图表的稀疏程度,问题在实践中可以解决。