我一直在研究相关组件,并在Wikipedia上看到了这个描述:
计算图形的连通分量非常简单 在线性时间(根据顶点和边的数量) 图表)使用广度优先搜索或深度优先搜索。在 无论哪种情况,从某个特定顶点v开始的搜索都会 之前找到包含v(而不是更多)的整个连通组件 返回。要查找图形的所有连接组件,请循环 通过它的顶点,首先开始新的广度或首先开始深度 每当循环到达尚未到达的顶点时搜索 包含在以前找到的连接组件中。
此操作的运行时间是多少?我发现有消息称联系组件是在O(n)
时间内完成的。但是,据我所知,在每个顶点都是自己的连通组件的最坏情况下,该算法必须执行n个DFS / BFS操作,每个操作本身都是O(n)
时间。因此,不应该是O(n^2)
?
答案 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|)