我遇到了这篇SO 帖子,其中建议在有向图中使用 DFS 进行循环检测由于回溯而更快。在这里,我引用该链接:
深度优先搜索比广度优先搜索更节省内存,因为您可以更快地回溯。如果您使用调用堆栈也更容易实现,但这依赖于最长的路径不会溢出堆栈。
此外,如果您的图表是定向的,那么您不仅要记住您是否访问过某个节点,还要记住您是如何到达那里的。否则你可能会认为你找到了一个循环,但实际上你只有两条独立的路径 A->B,但这并不意味着有一条路径 B->A。通过深度优先搜索,您可以在下降时将节点标记为已访问,并在回溯时取消标记它们。
为什么回溯很重要?
有人可以用示例图解释给定A->B
示例中的含义吗?
最后,我有一个DFS
用于在有向图中进行循环检测的代码,它不使用回溯,但仍然在O(E+V)
.
public boolean isCyclicDirected(Vertex v){
if (v.isVisited) {
return true;
}
v.setVisited(true);
Iterator<Edge> e = v.adj.iterator();
while (e.hasNext()) {
Vertex t = e.next().target;
// quick test:
if (t.isVisited) {
return true;
}
// elaborate, recursive test:
if (isCyclicDirected(t)) {
return true;
}
}
// none of our adjacent vertices flag as cyclic
v.setVisited(false);
return false;
}