java - DFS导致堆栈溢出

标签 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);
        }
    }
}

最佳答案

72 万个顶点对,一次遍历几十万个顶点对,在大多数系统上很容易溢出堆栈。

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

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);
        }
    }
}

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

关于java - DFS导致堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36672034/

相关文章:

java - 如何在 Java Swing 中从 MS Access 数据库动态获取数据?

java - 当使用 Integer 键迭代 HashMap 时,它总是按升序返回键吗?

python - 为什么我的 Iterative Deepening Depth-First Search 实现占用的内存与 BFS 一样多?

java - 带循环的深度优先搜索

c++ - 遍历任意深度树进行删除的最快方法?

java - 如何有效保管气钉中的 key ?

java - 在 Java 中将输入存储为不同类型

java - 使用 HashMap 从字符串中第一次出现后删除单词 "real"

algorithm - 是否也可以使用搜索算法(BFS 和 DFS)来获得最短路径?

java - 如何求dfs+回溯算法的时间复杂度?