BFS(广度优先搜索)每一步的时间复杂度

时间:2014-09-02 08:08:29

标签: time-complexity graph-algorithm analysis breadth-first-search adjacency-list

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

上述广度优先搜索代码使用邻接列表表示。

符号 -

  • G:图表
  • s:源顶点
  • u.color:存储每个顶点的颜色u∈V
  • u.π:存储你的前身
  • u.d =存储算法

    计算的从源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行中每一行的时间复杂度来回复此代码吗?

  • 1 个答案:

    答案 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行将仅循环通过当前节点链接到的边,而不是整个图中的所有边。因此,从边缘的角度来看,它们仅在双向图中最多循环两次,一次由它连接的每个节点循环。