关键词
- 广度优先搜索
- 图
- 队列
- 散列表
数学概念
图:由边和点组成的就叫图。图还分有向图,无向图。
解决问题
- 从A点出发,有到达B点的路径吗?
- 从A点出发,到达B点的最短路径?
时间复杂度
首先要在图中查找A点到B点的路径,需要沿着每一条边去查找,这样遍历完所有的边,时间复杂度就是O(边数)。
另外,使用了队列,对每一个点做了一次加入队列的操作,时间复杂度为 O(点的个数)。
所以,最终总的时间复杂度为: O(边数 + 点的个数)
图的数据结构
就是一个散列表,比如:
map = {};
// B,C,D 为 A 的邻居
map[A] = [B,C,D];
map[B] = [E,F];
map[C] = [F,H,M];
// D 没有邻居
map[D] = [];
map[E] = [];
map[F] = [];
map[H] = [];
map[M] = [];
练习
比如:上面的散列表,计算从起点A开始,到达M点的最短距离
//1. 先是把A的所有邻居加入队列
//2. 循环遍历队列,取出一个元素x
//3. 判断x是否为M
//4. 如果x=M,那么遍历结束,找到最短距离
//5. 如果x!=M,那么把x的所有邻居加入队列,继续循环
//6. 标记x已经遍历过了,避免死循环
//7. 直到找到x=Mw为止,或者没有找到
//8. 结束整个遍历查找过程
小结
- 图数据建模
- 搜索过的点,必须标记一下,避免重复加入队列导致死循环。
- 用队列是为了保证能够获取到正确的最短路径,因此一定要遵循队列的先进先出的特性。