我有数千个节点到数百万个节点的图表。我想在这些图中检测所有可能的周期。
我使用哈希表来存储边缘。 ((源节点,边缘权重) - >(目标节点))。
在OCaml中实现它的有效方法是什么?
看起来Tarjan的算法是最好的算法。
同样的实施方式最多。
答案 0 :(得分:2)
是的,Tarjan的强连接组件算法是一个很好的解决方案。您也可以使用所谓的path-based强组件算法,这些算法在(仔细完成时)具有可比较的线性复杂度。
如果您选择合理的数据结构,它们应该有效。在实现和分析原型实现之前,很难说更多。
我不明白你的图表表示是什么:你是否真的是(node,weight)
夫妻的哈希键?那么如何找到给定节点的所有邻居?对于大型图形结构,您应该优化访问时间,当然还要提高内存效率。
答案 1 :(得分:1)
如果你真的想找到所有可能的周期,那么在最坏的情况下问题似乎至少是指数级的。对于完整的图形,每个非空的节点子集都会为您提供不同的循环(包括从最后一个到第一个循环的链接)。 Forthermore每个子集的每个循环排列都会为您提供不同的循环。根据图表的稀疏程度,问题在实践中可以解决。