【问题标题】:Detecting all cycles in a directed graph with millions of nodes in Ocaml在 Ocaml 中检测具有数百万个节点的有向图中的所有循环
【发布时间】:2012-06-24 22:59:53
【问题描述】:

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

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

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

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

同样的实现最多。

【问题讨论】:

    标签: graph ocaml graph-algorithm


    【解决方案1】:

    是的,Tarjan 的强连通分量算法是一个很好的解决方案。您还可以使用所谓的path-based 强组件算法,这些算法(如果仔细使用)具有相当的线性复杂度。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 看起来每个节点平均有 2 条边,这使得它变得稀疏。
      • 听起来不错。将周期数估计为稀疏度的函数超出了我的范围,但这是一个有趣的问题。我通过谷歌搜索找到了一篇关于这个主题的论文,所以它似乎已经被研究过了。快速浏览一下,这个限制看起来还不错。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      • 2015-06-24
      相关资源
      最近更新 更多