查找强连接组件 - 无递归

时间:2012-04-09 18:00:50

标签: recursion graph components

我需要找到有向图的强连通分量。 我决定使用Tarjan的算法。到现在为止还挺好。 但是,我需要我的程序操作的数据集是巨大的,我得到stackoverflow异常。我无法增加堆栈大小,因此我需要找到另一种解决方案。

我可以将递归算法更改为迭代,但我想知道是否有“更清洁的解决方案”。

我想不是,但在开始实施迭代版本之前,我想确定。

感谢您的任何建议!

2 个答案:

答案 0 :(得分:1)

用于查找SCC的已知算法都基于DFS,它本质上是递归的,因此您基本上可以获得以下选项:

  • 与递归一起生活。不是一个选项,每个节点的递归都会很快填满堆栈
  • 使用迭代重写递归,为DFS提供自己的堆栈。不是那么难,我推荐这个
  • 发明了一种非递归算法。祝那个案子好运

答案 1 :(得分:0)

我也有这个问题,我发现两个解决这个问题的最好方法是将所有代码转移到一个新的线程像这样:

public class Class implements Runnable {
    @Override
    public void run() {
        ...
    }
} 

并在您的主类中执行此操作:

public class Main {
    public static void main(String[] args) {
        Thread th = new Thread(null, new Class(), "solution", 32 << 20);
        th.start();
    }
} 

Thread(ThreadGroup group, Runnable target, String name, long stackSize)

第一个参数是null,第二个参数是你要在这个线程上运行的类,第三个参数只是一个名字,它不是很重要,最后一个参数是你想要分配给这个线程的堆栈大小而我我想在这个例子中,堆栈大小是2 ^ 32字节(我不确定!)

您可以在此处找到有关Java中Thread的更多信息:https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

这些例子是Java;你可以用任何其他面向对象的语言做同样的事情。