非递归dfs(何时标记它被访问?)

时间:2013-11-03 19:54:42

标签: algorithm search artificial-intelligence graph-algorithm depth-first-search

所以我最近实现了一个非递归版本的DFS。事实证明,只要它们被推入堆栈或弹出它们,我就可以将节点标记为“已访问”。我正在努力解决的问题是在堆叠时将其标记为“已访问”。这两个版本都是某种DFS。或者它是一个是DFS而另一个不是。欢迎任何建议。

我认为如果我采用第二种方式,它将模仿递归dfs。但为什么另一个有效?

递归dfs(请忽略此)

dfsRec(node)
{
    visitedArray[node]=1;

    for all neighbours of node
        if they aren't visited
            dfsRec(neighbour);
}

dfs(startNode)
{
    visitedArray;
    dfsRec(startNode);  
}

1 个答案:

答案 0 :(得分:3)

第二种方式的问题(即标记弹出时访问的节点)是,只要图形有一个循环,你的代码就会永远循环。一旦DFS到达该周期,它将继续循环,因为节点在被弹出堆栈之前不会被标记为访问,因此可以一次又一次地推送通过一个循环可到达的任何节点,直到你的内存不足。

请注意,问题与DFS的递归实现没有太大区别:递归实现会导致堆栈溢出而不是耗尽内存,但其原因是相同的。