BFS简介

广度优先搜索算法(Breadth-First-Search),又译作宽度优先搜索,或横向优先搜索,简称BFS,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用open-closed表。

特性

 

空间复杂度

因为所有节点都必须被储存,因此BFS的空间复杂度为 O(|V| + |E|),其中 |V| 是节点的数目,而 |E| 是图中边的数目。注:另一种说法称BFS的空间复杂度为 O(BM),其中 B 是最大分支系数,而 M 是树的最长路径长度。由于对空间的大量需求,因此BFS并不适合解非常大的问题。

时间复杂度

最差情形下,BFS必须寻找所有到可能节点的所有路径,因此其时间复杂度为 O(|V| + |E|),其中 |V| 是节点的数目,而 |E| 是图中边的数目。

最佳解

若所有边的长度相等,广度优先搜索算法是最佳解——亦即它找到的第一个解,距离根节点的边数目一定最少;但对一般的图来说,BFS并不一定回传最佳解。这是因为当图形为加权图(亦即各边长度不同)时,BFS仍然回传从根节点开始,经过边数目最少的解;而这个解距离根节点的距离不一定最短。这个问题可以使用考虑各边权值,BFS的改良算法成本一致搜寻法en:uniform-cost search)来解决。然而,若非加权图形,则所有边的长度相等,BFS就能找到最近的最佳解。

广度优先搜索算法的应用

 

广度优先搜索算法能用来解决图论中的许多问题,例如:

  • 寻找图中所有连接元件(Connected Component)。一个连接元件是图中的最大相连子图。
  • 寻找连接元件中的所有节点。
  • 寻找非加权图中任两点的最短路径。
  • 测试一图是否为二分图
  • (Reverse) Cuthill–McKee算法

 

寻找连接元件

由起点开始,执行广度优先搜索算法后所经过的所有节点,即为包含起点的一个连接元件。

广度优先搜索,即BFS(Breadth First Search),是一种相当常用的图算法,其特点是:每次搜索指定点,并将其所有未访问过的邻近节点加入搜索队列,循环搜索过程直到队列为空。

        算法描述如下:

        (1)将起始节点放入队列尾部

         (2)While(队列不为空)

取得删除队列首节点Node

                          处理该节点Node

                          把Node的未处理相邻节点加入队列尾部

         使用该算法注意的问题:

        (1)使用该算法关键的数据结构为:队列,队列保证了广度渡优先,并且每个节点都被处理到

         (2)新加入的节点一般要是未处理过的,所以某些情况下最初要对所有节点进行标记

         (3)广度优先在实际使用时,很对情况已超出图论的范围,将新节点加入队列的条件不再局限于

相邻节点这个概念。例如,使用广度优先的网络爬虫在抓取网页时,会把一个链接指向的网页中的所有

URL加入队列供后续处理。

例题:

迷宫问题

迷宫是由一个一个的方格子组成,有些格子之间是相通的,而有些不是,把一只小白鼠放入这样一个迷宫,问小白鼠怎么样才能最快的走出迷宫

这里迷宫可以用一个简单的二维数组来表示,数组元素值1表示连通,0表示不连通。 这虽然不是一个直接的图的问题,但其实也不难看出其和图的相关性:

vertex:所有值为1的格子。 (值为0的格子因为不连通,从逻辑上来讲并不属于这个图,但我们依赖与它来判断两点间是否有edge存在)
edge: 任意两个相邻的,且值都为1的vertex之间的联系

可以发现,迷宫的这种对于图的表达方式,与传统的邻接表,邻接矩阵表达方式很不相同 (更加紧凑),但是却非常适合来表示迷宫这样的结构。这也是一个图,只不过有其特定的访问方式而已。 指定起点,与终点(任何边界vertex),在这个数组上应用BFS,就能找出走出迷宫的最短路径,当然,需要注意的是不能重复访问已经访问过的结点,我们可以直接修改表示迷宫的数组,如访问过了就设为0,也可以提供一个辅助数组来标记是否访问过。

(具体例题以及解法参考BFS例题)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值