BFS(G,s)
1 for each vertex u ∈ G.V-{s}
2 u.color = WHITE
3 u.d = ∞
4 u.π = NIL
5 s.color = GRAY
6 s.d = 0
7 s.π = NIL
8 Q ≠ Ø
9 ENQUEUE(Q, s)
10 while Q ≠ Ø
11 u = DEQUEUE(Q)
12 for each v ∈ G.Adj[u]
13 if v.color == WHITE
14 v.color = GRAY
15 v.d = u.d + 1
16 v.π = u
17 ENQUEUE(Q, v)
18 u.color = BLACK
上述广度优先搜索代码使用邻接列表表示。
符号 -
计算的从源s到顶点u的距离
理解代码(如果我错了就帮帮我) -
1. As far as I could understand, the ENQUEUE(Q, s) and DEQUEUE(Q) operations take O(1) time.<br>
2. Since the enqueuing operation occurs for exactly one time for one vertex, it takes a total O(V) time.
3. Since the sum of lengths of all adjacency lists is |E|, total time spent on scanning adjacency lists is O(E).
4. Why is the running time of BFS is O(V+E)?.
请不要将我介绍给某个网站,我已经阅读了很多文章,但我发现它很难理解。
任何人都可以通过写出18行中每一行的时间复杂度来回复此代码吗?
答案 0 :(得分:2)
第1-4行:总计O(V)
第5-9行:O(1)或O(常数)
第11行:O(V)表示循环内第11行的所有操作(每个顶点只能出列一次)
第12-13行:O(E)总计,因为您将检查每个可能的边缘一次。如果边是双向的,则为O(2E)。
第14-17行:总共O(V)作为你检查的E边缘,只有V顶点是白色。
第18行:总计O(V)
总结复杂性给你 O(4V + E + 1)简化为O(V + E)
新: 它不是O(VE),因为在从第10行开始的循环的每次迭代中,第12-13行将仅循环通过当前节点链接到的边,而不是整个图中的所有边。因此,从边缘的角度来看,它们仅在双向图中最多循环两次,一次由它连接的每个节点循环。