DFS 关于无向图的复杂性?

DFS on undirected graph complexity?

当我们使用 DFS 遍历无向连通图并仅标记出我们在 DFS 期间遍历的边时,我们最终得到一个 DFS 树,它基本上是一棵树并遍历一棵树需要 O(v) 复杂度,其中 v 是顶点数,那么为什么说复杂度是 O(v + e)?

我知道这是一个菜鸟问题,但我很困惑。

你通过边找到图的所有节点,所以时间复杂度取决于否。这也是为什么 O(e) 也包括在内的原因。如果你认为完整的图 TC 将是 O(V^2).

考虑两个不同的图表:

  1. 边数多于顶点数的图,例如 connected graph with a high minimum degree.

    当DFS算法访问一个顶点时,它必须沿着连接该顶点的每条边,从相邻的顶点重复一次DFS遍历。当然,如果那个邻居已经被访问过,DFS 算法会回溯,但至少我们可以声明必须处理该边。

    此过程将处理图的所有 条边。所以在这种情况下我们可以说算法是 O(e)

  2. 边比顶点少的图,通常是不连通的图(在极端情况下没有边)。

    当 DFS 算法已经访问了从顶点 A 开始的遍历可以到达的所有顶点时,它仍然必须迭代剩余的顶点,以找到可能没有被访问过的顶点。这些未访问的顶点不属于同一个 connected component)。另一个DFS遍历必须从那里开始。

    这样所有个顶点都被处理了。所以在这种情况下,算法具有 O(v) 时间复杂度

所以一般来说,算法的时间复杂度是O(max(e, v))。您也可以说该算法必须访问所有边 所有顶点,因此该算法具有 O(e+v) 时间复杂度。两者是等价的。

DFS 树是由您遍历 的边组成的树。您确实只遍历 O(V) 条边。但是为了遍历一条边,您首先要检查 这条边以检查它是否会通向您已经遇到的顶点。这意味着您 检查的边比您遍历的边多。实际上,您检查了 O(E) 个边。所以总工作量是 O(V+E).

注:因为你的图是连通的,你确定E > V。在那种情况下,复杂度可以改写为 O(E).