算法图解--学习笔记(广度优先搜索)

79 阅读1分钟

关键词

  • 广度优先搜索
  • 队列
  • 散列表

数学概念

图:由边和点组成的就叫图。图还分有向图,无向图。

解决问题

  • 从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. 结束整个遍历查找过程

小结

  • 图数据建模
  • 搜索过的点,必须标记一下,避免重复加入队列导致死循环。
  • 用队列是为了保证能够获取到正确的最短路径,因此一定要遵循队列的先进先出的特性。