【问题标题】:Time complexity for detecting a cycle in a graph检测图中循环的时间复杂度
【发布时间】:2020-07-18 13:58:30
【问题描述】:

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

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)。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 2017-04-11
      • 2016-12-17
      • 1970-01-01
      相关资源
      最近更新 更多