广度优先搜索
本章介绍的是图,首先介绍什么是图,然后再介绍一种图算法----广度优先搜索。
广度优先搜素能够让你找出两样东西间的最短距离,含义很多,比如:
①编写国际象棋AI,计算最少多少步获胜
②编写拼写检查器,计算最少编写多少个地方就可以将拼错的单词改为正确的单词。
③根据你的人际关系网络找到最近的医生。
6.1 图简介
例如前往东直门,最短路径需要倒2次车(3步),这种问题成为最短路径问题。要确定如何从沙河到东直门需要两步:
①使用图建立问题模型
②使用广度优先搜索解决问题
6.2 图是什么
图由节点和边组成。
6.3 广度优先搜索
这种算法可以帮助回答两类问题:
①从节点A出发,有前往节点B的路径吗?
②从节点A出发,前往节点B的哪条路径最短。
6.3.1 查找最短路径
①从节点A出发,有前往节点B的路径吗?(在你的朋友中,有芒果销售商吗)
②从节点A出发,前往节点B的哪条路径最短。(哪个芒果销售商与你的关系最近?)
先检查一度关系,再检查二度关系。只有按添加顺序查找时才能实现这样的目的。因此你需要按添加顺序进行检查,有一个可以实现这种目的的数据结构就是队列。
6.3.2 队列
队列和现实排队一样,先进先出。队列不能随机的访问元素,只支持两种操作,入队和出队。
如果你将两个元素加入队列,先加入的元素将在后加入的元素之前出队。 因此可以使用队列来查找名单。这样先加入的人将先出队并被检查。
6.4 实现图
6.5 实现算法
先概述一下这种算法的工作原理:
1.创建一个队列用于存储要检查的人
2.从队列中弹出一个人
3.检查这个人是否是芒果销售商
4是,成功;否,将这个人的所有邻居都加入队列
5.回到第2步
6.如果队列为空说明你的关系网中没有芒果销售商
运行时间
广度优先搜索的运行时间为O(人数+边数),通常写成O(V+E),其中V是顶点,E是边数。
6.6 小结