我正在研究广度优先搜索算法,即:
BFS(G,s)
for each u ∈ V\ {s}
color(u)=white
d(u)=oo
π(u)=NIL
color(s)=GRAY
d(s)=0
π(s)=NIL
Q=∅
ENQUEUE(Q,s)
while (Q!=∅)
u=DEQUEUE(Q)
for each v ∈ Adj(u)
if (color(v)=white)
color(v)=GRAY
d(v)=d(u)+1
π(v)=u
ENQUEUE(Q,v)
color(v)=BLACK
我认为就是这样: 第一个for循环的时间复杂度是O(V)。 while循环的时间复杂度为O(V),而while循环内执行的for循环的时间复杂度为O(E)。 然后算法的时间复杂度为O(VE + E)= O(VE)。 但是,根据我的教科书,它是O(V + E)。 那么,我计算错了吗?
答案 0 :(得分:1)
不,算法确实是O(VE),但它也是O(V + E)。您的边界松动,因为扫描邻接列表时每条边最多被考虑两次。
答案 1 :(得分:1)
嗯,因为这是最糟糕的情况,你的分析是正确但不紧张。只要队列中有顶点,while循环就会运行。只有颜色为白色的顶点才会排队,在这种情况下,它们的颜色会变成灰色,因此它们永远不会再排队。这告诉您队列可以像V一样大。
在每次迭代中,您遍历顶点的邻接列表,因此总运行时间是邻接列表+ V的长度之和。总和为O(E)。运行时间为O(V + E)。
记住在无向图中,以下内容可能很有用:sum of degrees of all vertices = 2 * E
。要看到这一点,请注意每条边(x,y)将被计算两次:一次是x度,一次是y度。