首页 > 其他 > 详细

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

时间:2020-04-16 12:11:04      阅读:85      评论:0      收藏:0      [点我收藏+]

一、图

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

技术分享图片

图分为有向图和无向图,由点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。

技术分享图片

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

原文:https://www.cnblogs.com/alvinai/p/12711774.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!