graph - 检测图中循环的时间复杂度

标签 graph complexity-theory depth-first-search cycle-detection

我试图了解一些检测图中周期的有效方法的时间复杂度。

解释了执行此操作的两种方法 here .我假设时间复杂度是根据最坏情况提供的。
第一个是 union-find,据说时间复杂度为 O(Vlog E)。
第二种使用基于 DFS 的方法,据说时间复杂度为 O(V+E)。如果我是正确的,这是比 O(Vlog E) 更有效的渐近复杂度。基于 DFS 的方法可用于有向图和无向图也很方便。

我的问题是我看不出第二种方法如何被认为在 O(V+E) 时间内运行,因为 DFS 在 O(V+E) 时间内运行并且算法检查与任何已发现节点相邻的节点为起始节点。这当然意味着该算法在 O(V2) 时间内运行,因为对于每个发现的节点可能必须遍历最多 V-1 个相邻节点?显然不可能超过一个节点需要遍历 n-1 个相邻节点,但据我了解,这仍然是运行时间的上限。

希望有人能理解我为什么这么想,并能帮助我理解为什么复杂度是 O(V+E)。

最佳答案

该算法基于 DFS,通常为每个顶点维护一个“已访问” bool 变量,其中包含一位信息——该顶点是否已被访问。因此,任何顶点都不能被多次访问。

如果图是连通的,那么从任何 顶点开始 DFS 将立即给你一个答案。如果图是一棵树,那么所有顶点将在对 DFS 的一次调用中被访问。如果图不是树,则对 DFS 的单次调用将找到一个循环 - 在这种情况下,可能不会访问所有顶点。在这两种情况下,由所有已访问的顶点导出的子图在 DFS 查找的每一步都将是一棵 - 因此遍历的边总数将是O(V)。因此,我们可以将循环检测算法的时间复杂度估计值 O(V+E) 降低到 O(V)

在图由多个连接组件组成的情况下,从图的所有顶点开始 DFS 是必要的 - “已访问” bool 变量保证 DFS 不会遍历一次又一次地使用相同的组件。

关于graph - 检测图中循环的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61062020/

相关文章:

c++ - 查询完整的有向图,判断上下游关系和距离

r - 在 ggplot (R) 中的图形内创建多边形

algorithm - 计算这个由多个分类器组成的 Ensemble 的 Big-O 符号

data-structures - 构造二叉搜索树的时间复杂度是多少?

Java深度优先搜索无限循环

图直径的算法?

graph - 小鬼/小叮当 : insert key:value property constant in every vertex and edge traversed then return path

algorithm - 如何找到任何二叉树中两个节点的最低公共(public)祖先?

algorithm - DFS 计算关节点的孤立节点

c++ - 如果满足特定条件,则停止沿特定深度的 boost::depth_first_search