【发布时间】:2017-02-25 10:15:10
【问题描述】:
我使用的是 Mac、4GB 的 RAM 和 CLion IDE。编译器是 Clang。我需要在深度优先搜索的递归实现中允许更多递归(当前在具有 80k 节点的图上失败)。
typedef unordered_map <int, vector<int>> graph;
void DFS (graph &G, int i, vector <bool> &visited) {
visited[i] = true;
for (int j = 0; i < G[i].size(); j++) {
if (!visited[G[i][j]]) {
DFS(G, G[i][j], visited);
}
}
t++;
finishingTime[t] = i; //important step
}
这是为了实现 Kosaraju 算法来计算图中的强连通分量。 https://en.wikipedia.org/wiki/Kosaraju%27s_algorithm 我知道可以将 DFS 实现为迭代,但最后一步很重要,我找不到使用迭代包含它的方法。这是因为该步骤是在 DFS 失败并发生回溯时完成的,而递归提供了一种非常自然的方式来执行此操作。
所以目前我只有两个选择:
- 增加堆栈大小以允许更多递归
- 或者找一个迭代解决方案
有什么办法吗?
【问题讨论】:
-
“或者找到一个迭代的解决方案”你总是可以使用
std::stack而不是递归。 -
增加堆栈大小只会推迟问题:)
-
你有没有看我的问题? :P 我知道有一个迭代的 DFS 实现,但它不适用于 Kosaraju 的算法。回溯发生时需要做一些修改来记录。
-
(不应该是
finishingTime[i] = t;吗?//important step是一个骇人听闻的评论 - 描述 what 一些代码要完成 - 如果 你不能让它太明显。) -
@Rad Lexus 这在很大程度上是部分事实。堆栈大小非常有限,即使在相当普通的桌面上,堆大小也会达到数十亿字节。最终这种蛮力算法会失败,而爆栈的事实表明它可能是错误的方法,但在没有看到整个问题的情况下,我们无法对此发表评论。