【发布时间】:2012-06-24 22:59:53
【问题描述】:
我有数千个节点到数百万个节点的图表。我想检测这些图中所有可能的循环。
我使用哈希表来存储边缘。 (((源节点,边权重) -> (目标节点))。
在 OCaml 中实现它的有效方法是什么?
看起来 Tarjan 的算法是最好的。
同样的实现最多。
【问题讨论】:
标签: graph ocaml graph-algorithm
我有数千个节点到数百万个节点的图表。我想检测这些图中所有可能的循环。
我使用哈希表来存储边缘。 (((源节点,边权重) -> (目标节点))。
在 OCaml 中实现它的有效方法是什么?
看起来 Tarjan 的算法是最好的。
同样的实现最多。
【问题讨论】:
标签: graph ocaml graph-algorithm
是的,Tarjan 的强连通分量算法是一个很好的解决方案。您还可以使用所谓的path-based 强组件算法,这些算法(如果仔细使用)具有相当的线性复杂度。
如果您选择合理的数据结构,它们应该可以工作。在您实施和分析原型实施之前,很难说更多。
我不明白您的图形表示是什么:您的散列键真的是(node,weight) 一对吗?那么如何找到给定节点的所有邻居呢?对于大型图结构,您当然应该优化访问时间,还要优化内存效率。
【讨论】:
如果您真的想找到所有可能的循环,那么在最坏的情况下,问题似乎至少是指数级的。对于完整的图,每个非空节点子集都会为您提供不同的循环(包括从最后一个返回到第一个的链接)。此外,每个子集的每个循环排列都会给你一个不同的循环。根据您的图表的稀疏性,该问题在实践中可能很容易解决。
【讨论】: