宽度优先搜索能够处理的问题
宽度优先搜索的对象一般是二叉树、图、矩阵,这三种其实都可以归类为图,使用宽度优先搜索的情况有以下三种:
- 按层遍历。(level order traversal)
计算简单图的最短路径长度,简单图——边的权值为1的无向图。
- 由点及面。(connected component)
计算扩散、传播、感染的最短时间问题。
- 拓扑排序。(topological sorting)
节点之间存在相互依赖关系的有向图的拓扑问题。
代码注意事项
宽度优先搜索需要用到数据结构queue(队列),代码要点如下:
-
如果宽搜过程中需要进行层级遍历,需要提前记录queue的长度。
int size = queue.size(); for (int i = 0; i < size; i++) { …… }
-
图的两种代码表示方式:邻接表、邻接矩阵。
map<XXX *, set<XXX *>> adjacentMap; // 邻接表 vector<vector<bool>> adjacentMatrix; // 邻接矩阵
时间复杂度分析
二叉树上的宽度优先搜索的时间复杂度:
算法会将所有的节点和边都遍历一遍,耗时为O(n + (n - 1))
,总的时间复杂度为O(n)
。
图上的宽度优先搜索的时间复杂度:
图上的节点个数如果为n
,边的数量为m
,则复杂图中的m最极端的情况最大可以到达n^2
,所以图上的宽度优先搜索的时间复杂度为O(n + m) = O(n^2)
。
矩阵上的宽度优先搜索的时间复杂度:
矩阵可以看成图的一种,如果矩阵的行数为R
,列数为C
,其中节点数为R*C
,边数为((R-1)*C) + (R*(C-1)) = 2R*C-R-C
,所以矩阵上的宽度优先搜索的时间复杂度为O(R * C)
。
题目汇总
- 二叉树的层级遍历(Binary Tree Level Order Traversal)https://blog.csdn.net/SeeDoubleU/article/details/124395566
- 将二叉树按照层级转化为链表(Convert Binary Tree to Linked Lists by Depth)https://blog.csdn.net/SeeDoubleU/article/details/124395634
- 验证给定的图是否构成有效的树(Graph Valid Tree)https://blog.csdn.net/SeeDoubleU/article/details/124395644
- 克隆图(Clone Graph)https://blog.csdn.net/SeeDoubleU/article/details/124395647
- 拓扑排序(Topological Sorting)https://blog.csdn.net/SeeDoubleU/article/details/124395653
- 计算岛屿的个数(Number of Islands)https://blog.csdn.net/SeeDoubleU/article/details/124395659
- 僵尸矩阵(Zombie In Matrix)https://blog.csdn.net/SeeDoubleU/article/details/124395667
- 骑士的最短路线(Knight Shortest Path)https://blog.csdn.net/SeeDoubleU/article/details/124395672
- 单词接龙(Word Ladder)https://blog.csdn.net/SeeDoubleU/article/details/124395674