广度优先遍历,也称广度优先查找、广度优先搜索等。
基本思想
假设初始状态时图中所有顶点都未曾被访问,则广度优先遍历算法从图中某个顶点(任一顶点)出发,访问此顶点并依次访问该顶点的各个未曾访问过的邻接点。然后,分别从这些邻接点出发依次访问他们的临邻接点,并使"先被访问的顶点的邻接点"先于"后被访问的顶点的邻接点"被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。 换句话说,广度优先遍历的过程是以任一顶点开始,由近及远,依次访问和该顶点路径相通且路径长度为1,2,3,…的顶点。
伪代码实现
假设图G(V, E)表示要遍历的图,广度优先遍历的伪代码实现如下:
使用邻接矩阵或邻接表表示图G(V, E)
使用visited[VertexCount]数组记录顶点是否已被访问,其中true表示已访问,false表示未访问
for i=0;i<VertexCount;i++ then
visited[i] = false
for each vertex v in V then
if(v is not visited) then
bfs(v)
bfs(v)
visited[v] = true
add v to Queue
while the Queue is not empty then
for(each vertex w in v's adjacent V') then
if(w is not visited) then
visited[v] = true
add w to the Queue
remove the first vertex from the Queue
广度优先遍历的效率和深度优先遍历的效率是相同的。对于使用二维数组表示的邻接矩阵时,查找每个顶点的邻接点所需的时间为
O
(
∣
V
∣
2
)
O(|V|^2)
O(∣V∣2)。而当使用邻接表时,由于临邻接点可以使用链表存储,所以查找每个顶点的邻接点所需的时间为
O
(
∣
V
∣
+
∣
E
∣
)
O(|V| + |E|)
O(∣V∣+∣E∣)。
参考
《数据结构 严蔚敏 吴伟民 著 《算法设计与分析基础》 第三版 Anany Levitin 著 潘彦 译 https://blog.csdn.net/qq_40310148/article/details/106786652 图的深度优先遍历(DFS) https://leetcode-cn.com/circle/article/YLb5l4/ 图文详解 BFS, DFS https://blog.csdn.net/qq_41170102/article/details/105043114 leetcode高频题笔记之DFS和BFS
|