[MIT6.006] 13. Breadth-First Search (BFS) 广度优先搜索

一、图

在正式进入广度优先搜索的学习前,先了解下图:

图分为有向图和无向图,由点vertices边edges构成。图有很多应用,例如:网页爬取,社交网络,网络传播,垃圾回收,模型检查,数学推断检查和解谜等。

 

下面拿Pocket Cube魔方(2x2x2立方体魔方)来举个例子:

对于解魔方来说,可以先构建一个初始图,画出每个小立方可能状态上的点,还有可能移动的边,示意图如上图所示,这里讲师没有过多讲解其中的数学内容,只需要了解图在魔方上的解答应用。

 

二、图的表示

作者讲了三种图的表示方法:邻接表(Adjacency List),面向对象法和含糊表示法。重点是邻接表。

我这里就只讲邻接表,它跟散列表看起来有点像,就是定义了所有顶点v都属于顶点集V,邻接表Adj就是一个带连接的数列表,Adj[b] = {a, c} 说明b点和a和c点之间有连接。构建一个邻接表,复杂度估为θ(|V| + |E|)。

 

三、广度优先搜索

  • 给定一个点s,s属于顶点集V,从s连接到V中可达到的所有点。
  • Ο(V + E) 复杂度。
  • 在0次移动{s},1次移动Adj{s},...等移动下,查看所有可达到的点。
  • 谨慎地避开重复。

 

下图左侧展示了BFS的伪代码:

上图右侧举例来讲这个BSF代码的运行过程:

  • 首先,看点s,它是起始点,所以level=0;
  • 然后看Adj[s]下与点s有连接的点,这里是点a和点x,所以parent(a)和parent(x)为s,而a和x的level为1,frontier(即next)加入a和s,进行下一步搜索;
  • 然后看Adj[a]和Adj[x]下与的连接点,最后得到z,d和c,并将它们划分为level3。
  • 不断重复点都划分完。

通过BSF,我们能轻松地得到图中任意两点之间的最短路径(Shortest Path),比如s到v的最短路径就是level[v]的大小,即3。

posted @ 2020-04-16 11:57  Alvin_Ai  阅读(524)  评论(0)    收藏  举报