广度优先搜索算法(Breadth-First-Search)

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

广度优先搜索
节点搜索的顺序
节点进行广度优先搜索的顺序
概况
类别:搜索算法
数据结构:
时间复杂度:O(|V|+|E|) = O(b^d)
空间复杂度:O(|V|+|E|) = O(b^d)
最佳解:
完全性:

作法

BFS是一种盲目搜寻法,目的是系统地展开并检查中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位址,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验法则算法

从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出伫列中。一般的实作里,其邻居节点尚未被检验过的节点会被放置在一个被称为 open 的容器中(例如伫列或是链表),而被检验过的节点则被放置在被称为 closed 的容器中。(open-closed表)

德国城市为范例的地图。城市间有数条道路相连接。



法兰克福开始执行广度优先搜索算法,所产生的广度优先搜索算法树。
广度优先搜索算法的动画范例


 s为初始点 
 R:=\{ s \},Q:=\{ s \},T=\empty 
 while Q \ne \empty 
     从Q中选一点    
     /* 选最先插入进Q的点,则为广度遍历,可以说先进先出。*/
     /* 选最后插入进Q的点,则为深度遍历,可以说后进先出。 */
     if \exists w \in N(v) \setminus R then    /* N(v):v的邻接点 */
         Q:=Q \cup \{ w \}
         R:=R \cup \{ w \}
         T:=T \cup \{ vw \}
     else Q:=Q \setminus \{ w \}
 return H=(R,T)
 
 

特性

空间复杂度

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

时间复杂度

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

完全性

广度优先搜索算法具有完全性。这意指无论图形的种类如何,只要目标存在,则BFS一定会找到。然而,若目标不存在,且图为无限大,则BFS将不收敛(不会结束)。

最佳解

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值