Java中的图DFS在大输入上给出堆栈溢出错误

时间:2015-04-22 18:22:21

标签: java

这是针对给定的无向图的作业问题,如果它是2可着色的,则将其着色,如果不是,则在其中输出一些奇数长度的循环。这个方法经过,着色,如果它找到一个循环,它会弹回堆栈并输出循环。它适用于小输入,但在大输入时会产生堆栈溢出错误。我有什么办法可以让它不会因为大输入而溢出吗?

P.S。我知道我应该对Node中的变量使用getter和setter方法。 Children是具有给定节点边缘的所有节点的列表。

public static boolean isOddLoop(Node current){
    for(int x=0; x<current.children.size(); x++){
        Node next = current.children.get(x);
        if(next.color==0){ //i.e. is unvisited
            next.color=3-current.color; //colors are 1 and 2, so this sets it to the opposite
            if(isOddLoop(next)){
                System.out.println(current.number + ": " + current.color);
                return true;
            }   
        }
        if(next.color==current.color){
            System.out.println(next.number + ": " + next.color);
            System.out.println(current.number + ": " + current.color);
            return true;
        }
    }
    return false;
}

1 个答案:

答案 0 :(得分:1)

正如上面的评论所说,增加分配给JVM堆栈的内存肯定会缓解这个问题。请在此处查看此帖子,以获取Java stack overflow error - how to increase the stack size in Eclipse?

的帮助

我认为更好的解决方案是切换到BFS而不是DFS。使用BFS也是2着色问题的有效解决方案。此外,BFS可以使用队列完成,而不是递归。然后,你有一个小得多的堆栈,而不是你的堆大小限制。请注意,由于您不再拥有用于跟踪父节点的堆栈,因此您需要在节点类中为父节点添加指针并随时更新它。