我知道对于一个连接的间接图,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效率低下,请告诉我一个高效的代码。
谢谢!
答案 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)
。