广度优先搜索即是 一种“地毯式”层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索。
BFS解决的最短路径问题。 采用BFS进行遍历的话,需要依赖队列,先进先出。
假设我们有这么一个图,里面有A、B、C、D、E、F、G、H 8 个顶点,点和点之间的联系如下图所示, 对这个图进行广度优先的遍历
第一步 选择起始顶点,从顶点 A 开始。把 A 压入队列,标记它为访问过(用红色标记)。
第二步 从队列的头取出顶点 A,输出到结果中,同时将与它相连的尚未被访问过的点按照字母大小顺序压入队列,同时把它们都标记为访问过,防止它们被重复地添加到队列中。
第三步 从队列的头取出顶点 B,打印输出它,同时将与它相连的尚未被访问过的点(也就是 E 和 F)压入队列,同时把它们都标记为访问过。
第四步 继续从队列的头取出顶点 D,打印输出它,此时我们发现,与 D 相连的顶点 A 和 F 都被标记访问过了,所以就不要把它们压入队列里。
第五步 接下来,队列的头是顶点 G,打印输出它,同样的,G 周围的点都被标记访问过了。我们不做任何处理。
第六步 队列的头是 E,打印输出它,它周围的点也都被标记为访问过了,我们不做任何处理。
第七步 接下来轮到顶点 F,打印输出它,将 C 压入队列,并标记 C 为访问过。
第八步 将 C 从队列中移出,打印输出它,与它相连的 H 还没被访问到,将 H 压入队列,将它标记为访问过。
第九步 队列里只剩下 H 了,将它移出,打印输出它,发现它的邻居都被访问过了,不做任何事情。
第十步 队列为空,表示所有的点都被处理完毕了,程序结束。
时间复杂度采用邻接表方式实现每个顶点都需要被访问一次,时间复杂度是 O(V) ;相连的顶点(也就是每条边)也都要被访问一次,加起来就是 O(E) 。因此整体时间复杂度就是 O(V+E) 。采用邻接矩阵方式实现V 个顶点,每次都要检查每个顶点与其他顶点是否有联系,因此时间复杂度是 O(V^2)。