BFS对于非连接图和间接图的运行时间复杂度

时间:2018-11-28 05:25:30

标签: algorithm graph-algorithm breadth-first-search

我知道对于一个连接的间接图,BFS的运行时间为O(V + E)。但是,如果图形未连接怎么办?然后,我假设我们需要运行一个循环来首先检查每个顶点的状态(是否已访问)。

这是我的想法的简单qseudocode。假设每个顶点在开始时都没有访问的标志是白色。访问时为灰色,拍摄时为黑色。

// BFS用于未连接的间接图

BFS(G):   
for each v in G:
    if (v.color is white) do:
        v.color = gray;
        enqueue(Q, v);
        while Q is not empty do:
            u = dequeue(Q);
            while s is adjacent to u has color white
                  s.color = gray;
                  enqueue(Q,s);
            u.color = black;

这是我对未连接间接图的qseudocode的猜测。我很难弄清楚运行时间。我认为它仍然是O(V + E),但我无法真正给出合理的解释。

我可以知道如何阐明此qseudocode的运行时间吗?或者,如果我的qseudocode效率低下,请告诉我一个高效的代码。

谢谢!

2 个答案:

答案 0 :(得分:0)

是的,您是正确的。 O(|V|)中的外部循环最多迭代一次所有顶点。内部是连接图的BFS,即O(|V|+|E|)。然后,由于您最多每O(|V|+|E|)次查看每个顶点和每个边缘,因此总体上它停留在O(1)中。

作为更笼统的解释,在图中,顶点数量是线性的,但边的数量是平方的,请考虑一个complete graph。因此,如果图形断开连接,则简单地可以遍历较少的边。

答案 1 :(得分:0)

是的,时间复杂度仍然为O(V + E)

只需检查每个循环以及循环可能运行的最大次数。

外部循环将具有O(V)个步骤。

循环检查队列还将具有O(V)个步骤,因为图形中的每个节点仅被插入队列一次(当颜色为白色时)。

棘手的部分是第三次循环,检查u的相邻节点。请注意,我们已经确定u将只代表图形中的每个节点一次。如果将邻接表用于图形表示,则此步骤将花费O(E)时间。

总时间复杂度:O(V + E)