python实现BFS和DFS算法
1 需要遍历的图
2 算法设计过程
2.1 BFS程序设计
算法步骤:
1、创建一个队列,选择遍历的起点插入到队列中。
2、创建一个记录节点是否被遍历过的set,以防止节点被多次遍历形成(多次遍历亦有可能陷入死循环)。
3、当队列不为空时,从队中弹出节点并输出以记录。并依次遍历将该节点的下一层节点,依次插入到队尾。插到队尾之前需要先检查该子节点是否已被遍历,遍历过则不插入,没遍历过则插入并在visited集合中记录该点。
4、重复3直到队列为空,此时所有节点均被遍历,并且是“由内向外”。
复杂度分析:
需要注意的是复杂度的好坏取决于图的存储结构,也就是图是以邻接表存储还是以邻接矩阵存储。
- 时间复杂度:
邻接表存储时,从一个顶点开始搜索时,访问未被访问过的节点,最坏情况下是所有邻接点均未被访问过(即遍历所有点所有边后才找到终点),这时每个邻接点和边均要被访问一次(邻接表是一维数组存节点,链表存边(节点间关系)来实现的),所以 T = O ( V + E ) T=O(V+E) T=O(V+E),其中V是顶点数,E是边数。
邻接矩阵存储时,查找每个顶点的邻接点所需时间为 O ( V ) O(V) O(V)(邻接矩阵是由二维数组存储边,一维数组存储点来实现的),即遍历该节点所在的该行该列。又有n个顶点,故算总的时间复杂度为 O ( ∣ V ∣ 2 ) O(|V|^2) O(∣V∣