我在一个具有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);
}
}
}
答案 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);
}
}
}
注意:以上假设邻接列表无序。如果需要保留特定的排序以匹配递归版本,请更改嵌套循环以反向枚举邻接列表。