DFS导致堆栈溢出

时间:2016-04-17 02:24:41

标签: java depth-first-search

我在一个具有72万个顶点对的数据文件中编写了一个关于dfs的简单代码,并找到堆栈溢出。我不太确定它是由大数据集还是我的代码问题引起的。任何想法都表示赞赏。代码部分如下所示:

private void dfs(Graph G, int v) {
    dfsMarked[v] = true;
    for (Edge e : G.adj(v)) {
        int w = e.other(v);  
        if (!dfsMarked[w]) {
            dfsEdgeTo[w] = v;
            dfs(G, w);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

在大多数系统中,有72万个顶点对,其传递数量超过几十个,很容易溢出堆栈。

您需要切换到DFS的实现,该实现使用独立于Java堆栈分配的自己的堆栈:

Stack<Integer> stack = new Stack<Integer>();
stack.push(start);
while (!stack.empty()) {
    int v = stack.pop();
    dfsMarked[v] = true;
    for (Edge e : G.adj(v)) {
        int w = e.other(v);  
        if (!dfsMarked[w]) {
            dfsEdgeTo[w] = v;
            stack.push(w);
        }
    }
}

注意:以上假设邻接列表无序。如果需要保留特定的排序以匹配递归版本,请更改嵌套循环以反向枚举邻接列表。