连通分量计算算法的运行时间

时间:2017-08-02 19:13:14

标签: algorithm performance data-structures graph time-complexity

我一直在研究相关组件,并在Wikipedia上看到了这个描述:

  

计算图形的连通分量非常简单   在线性时间(根据顶点和边的数量)   图表)使用广度优先搜索或深度优先搜索。在   无论哪种情况,从某个特定顶点v开始的搜索都会   之前找到包含v(而不是更多)的整个连通组件   返回。要查找图形的所有连接组件,请循环   通过它的顶点,首先开始新的广度或首先开始深度   每当循环到达尚未到达的顶点时搜索   包含在以前找到的连接组件中。

此操作的运行时间是多少?我发现有消息称联系组件是在O(n)时间内完成的。但是,据我所知,在每个顶点都是自己的连通组件的最坏情况下,该算法必须执行n个DFS / BFS操作,每个操作本身都是O(n)时间。因此,不应该是O(n^2)

的运行时间

1 个答案:

答案 0 :(得分:3)

首先,使用DFS或BFS遍历具有G(V, E)个顶点和|V|边的单个连通分量|E|具有O(|V|+|E|)复杂度。

  

线性时间(根据顶点和边缘的数量)   图)

我们假设图G(V, E)k个连接组件。

G(V, E) = G1(V1, E1) ∪ G2(V2, E2) ∪ ... ∪ Gk(Vk, Ek)

Gi中的DFS / BFS可以找到每个组件O(|Vi|+|Ei|)。因此,算法的总时间为每个未访问的顶点启动DFS或BFS以遍历其连接的组件:

O(|V1|+|E1|) + O(|V2|+|E2|) + ... + O(|Vk|+|Ek|) + O(|V|)

这些组件没有任何共同的顶点或边缘,因为它们没有连接。所以:

|V| = |V1| + |V2| + ... + |Vk|
|E| = |E1| + |E2| + ... + |Ek|

最后,连接组件计算的总体复杂性是:

O(|V1|+|E1|) + O(|V2|+|E2|) + ... + O(|Vk|+|Ek|) + O(|V|) =
O(|V1|+|V2|+...+|Vk| + |E1|+|E2|+...+|Ek|) + O(|V|) =
O(|V|+|E|) + O(|V|) =
O(|V|+|E|)