📜  数据结构-广度优先遍历(1)

📅  最后修改于: 2023-12-03 15:10:20.014000             🧑  作者: Mango

广度优先遍历

在计算机科学中,广度优先遍历(英语:Breadth-First Search,缩写为 BFS)是一种图形搜索算法。在搜索时,从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先遍历的实现一般采用队列的数据结构对已访问节点进行记录。

实现思路

广度优先遍历可以使用队列来实现:将起始节点放入队列中,然后循环以下步骤:

  1. 从队列中取出一个节点
  2. 如果该节点为目标节点,结束搜索,否则将该节点的未访问过的相邻节点放入队列中
  3. 重复步骤1-2,直到队列为空
代码示例
from collections import deque

# 假设我们要遍历下面这个邻接表表示的图,起始顶点为 0。
graph = {
    0: [1, 2],
    1: [2],
    2: [0, 3],
    3: [3]
}

def bfs(graph, start):
    # 标记所有顶点为未访问
    visited = [False] * len(graph)
    # 创建一个队列,用于存放待访问的顶点
    queue = deque([start])
    # 将起始顶点标记为已访问
    visited[start] = True

    # 循环访问队列中的每个顶点
    while queue:
        vertex = queue.popleft()
        print(vertex, end=" ")

        # 遍历该顶点的所有邻接顶点,如果未访问过则放入队列中
        for adjacent_vertex in graph[vertex]:
            if not visited[adjacent_vertex]:
                visited[adjacent_vertex] = True
                queue.append(adjacent_vertex)

# 输出遍历结果:0 1 2 3
bfs(graph, 0)
时间复杂度

在最坏情况下,需要遍历整张图才能找到目标节点,即时间复杂度为 $O(V+E)$,其中 $V$ 表示顶点数,$E$ 表示边数。