广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS)

1. 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS)

depth-first search,DFS:深度优先搜索
breadth-first search,BFS:广度优先搜索

Breadth-first search (BFS) is an algorithm for traversing or searching tree or graph data structures. It starts at the tree root (or some arbitrary node of a graph, sometimes referred to as a search key), and explores all of the neighbor nodes at the present depth prior to moving on to the nodes at the next depth level.
广度优先搜索 (BFS) 是用于遍历或搜索树或图形数据结构的算法。它从树的根部 (或图的某个任意节点,有时称为搜索关键字) 开始,并在移至下一个深度级别的节点之前先探索当前深度的所有邻居节点。

广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS) 是一种图形搜索算法。BFS 是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用 open-closed 表。

It uses the opposite strategy as depth-first search, which instead explores the node branch as far as possible before being forced to backtrack and expand other nodes.
它使用与深度优先搜索相反的策略,而是在被迫回溯和扩展其他节点之前,尽可能地探索节点分支。


以德国城市为示例的地图。城市间有数条道路相连接。(An example map of Southern Germany with some connections between cities.)


从法兰克福开始运行广度优先搜索算法,所产生的广度优先搜索算法树。(The breadth-first tree obtained when running BFS on the given map and starting in Frankfurt.)


广度优先搜索算法的动画示例 (Animated example of a breadth-first search) - 达到覆盖面积的作用

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

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

animate [ˈænɪmeɪt]:vt. 使有生气,使活泼,鼓舞,推动 adj. 有生命的

广度优先搜索 (BFS) 是图的一种遍历方式,它以广度优先进行搜索。简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次进行被访问点的邻接点,一层一层访问,直至访问完所有点,遍历结束。

1.1 无向图的广度优先搜索过程

遍历结果:A -> C -> D -> F -> B -> G -> E

1.2 有向图的广度优先搜索

遍历结果:A -> B -> C -> E -> F -> D -> G

2. 深度优先搜索 - 广度优先搜索

  • 深度优先搜索占内存少但速度较慢,广度优先搜索占内存多但速度较快。
  • 深度优先搜索与广度优先搜索的控制结构和产生系统很相似,唯一的区别在于对扩展节点选取上。
  • 深度优先搜索与广度优先搜索两种算法每次都扩展一个节点的所有子节点,不同的是,深度优先下一次扩展的是本次扩展出来的子节点中的一个,而广度优先扩展的则是本次扩展的节点的兄弟点。在具体实现上为了提高效率,所以采用了不同的数据结构。

2.1 深度优先搜索 (depth-first search,DFS)

深度优先搜索用栈 (stack) 来实现,整个过程可以看做一个倒立的树形。

  1. 把根节点压入栈中。
  2. 每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。
  3. 找到所要找的元素时结束程序。
  4. 如果遍历整个树还没有找到,结束程序。

2.2 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS)

广度优先搜索使用队列 (queue) 来实现,整个过程可以看做一个倒立的树形。

  1. 把根节点放到队列的末尾。
  2. 每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。
  3. 找到所要找的元素时结束程序。
  4. 如果遍历整个树还没有找到,结束程序。

3. 空间复杂度

说法一
所有节点都必须被存储,BFS 的空间复杂度为 O(∣V∣+∣E∣)O(|V|+|E|)O(∣V∣+∣E∣),其中 ∣V∣|V|∣V∣ 是节点的数目,而 ∣E∣|E|∣E∣ 是图中边的数目。

说法二
BFS 的空间复杂度为 O(BM)O(B^M)O(BM),其中 BBB 是最大分支系数,而 MMM 是树的最长路径长度。由于对空间的大量需求,BFS 并不适合解非常大的问题。对于类似的问题,应用 IDDFS 以达节省空间的效果。

4. 时间复杂度

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

5. 完全性

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

6. 最佳解

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

7. 广度优先搜索算法的应用

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

  • 查找图中所有连接组件 (Connected Component)。一个连接组件是图中的最大相连子图。
  • 查找连接组件中的所有节点。
  • 查找非加权图中任两点的最短路径。
  • 测试一图是否为二分图。
  • (Reverse) Cuthill-McKee 算法
reverse [rɪˈvɜːs]:v. 颠倒,撤销,反转,交换,放弃立场,倒车,打对方付费的电话,(使铅字、图案) 印成白或浅色 n. 逆向,相反,背面,倒档,失败,(美橄) 横式传球,(翻开书的) 左手页 adj. 相反的,背面的,颠倒的,反身的,(地层) 逆断的
activator ['æktɪveɪtə]:n. 催化剂,活化剂,激活剂,触媒剂

7.1 查找连接组件

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

References

https://en.wikipedia.org/wiki/Breadth-first_search
https://en.wikipedia.org/wiki/Depth-first_search

广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS)相关推荐

  1. DFS(Depth First Search,深度优先搜索)与BFS(Breadth First Search,广度优先搜索)总结与思考

    目录 Depth First Search(dfs) 代码(递归) 代码(非递归) Breadth First Search(bfs) 代码 比较 数据结构 时间复杂度 使用 例题:岛的个数 dfs实 ...

  2. 生成图-深度优先搜索/宽度优先搜索

    问题提出: 考虑如下图所示的简单图所表示的缅因州的道路系统.在冬天里保持道路通路通畅的唯一方式就是经常扫雪.高速公路部分希望只扫尽可能少的道路上的雪,而确保总是存在连接任何两个乡镇的干净道路.如何才能 ...

  3. 玉米社:SEM竞价搜索推广移动优先还是PC优先,怎么设置?

    SEM竞价搜索推广移动优先还是PC优先,怎么设置? 很长的时间里,PC流量都是搜索推广的主力军,而如今,移动流量突飞猛进,甚至在部分行业,移动搜索流量早已超越PC端. 如果你所在行业,移动端流量很多, ...

  4. 数据结构与算法(python):广度优先搜索(Breadth First Search,BFS)和深度优先算法(Depth First Search,DFS)

    参考自 MOOC数据结构与算法Python版 目录 一.广度优先搜索 1.1 BFS算法过程 1.2 广度优先搜索算法分析 二.深度优先搜索 2.1 骑士周游 2.1.1 问题定义 2.1.2 构建骑 ...

  5. C++Breadth First Search 广度优先搜索(附完整源码)

    C++Breadth First Search 广度优先搜索的实现 C++Breadth First Search 广度优先搜索实现完整源码(定义,实现,main函数测试) C++Breadth Fi ...

  6. “进化”的搜索方式:揭秘微软语义搜索背后的技术

    编者按:作为一项云搜索服务,Azure 认知搜索集成了强大的 API 和工具,帮助开发人员构建丰富的搜索体验.不止于现状,微软的研究员们为 Azure 认知搜索"加持"了语义搜索功 ...

  7. 今日头条搜索应该怎么做?头条搜索SEO排名和信息流排名课程

    今日头条搜索应该怎么做? 今日头条不仅是一个搜索引擎平台,也是一个信息流平台,所以做头条SEO可以从这两个方面入手. 信息流排名: 头条搜索聚合了独立三方内容和自由平台内容,搜索频道有综合.资讯.视频 ...

  8. 谷歌搜索:几乎所有的英文搜索都用上BERT了

    点击上方"视学算法",选择"星标"公众号 第一时间获取价值内容 来自:机器之心 在前段时间举办的「Search On」活动中,谷歌宣布,BERT 现在几乎为谷歌 ...

  9. android实现分类搜索功能,android应用中的搜索功能怎么实现的

    GCT1015 在app应用中,至少要执行如下的三个步骤,才能让app应用能够进行检索.如果要提供搜索建议,还需要执行第4步: 编写搜索配置的XML文件 编写搜索的activity类 在Android ...

最新文章

  1. 解决导入.vdi文件时报“uuid is exists”错误
  2. python中if else语句用法_讲解Python中if语句的嵌套用法
  3. pb打印选择页数_要想打印不卡纸,卡纸原因要了解
  4. 过度加班被表彰引员工不满。官方回应:持续高强度的急行军不持久,尽快优化调整...
  5. Linux下ntpdate时间同步
  6. 向模态窗体传递参数和获取返回值
  7. 虚拟化技术--服务器虚拟化
  8. FFmpeg在Ubuntu的安装以及教程~~~
  9. service nginx start启动nginx出现Failed to start nginx.service:unit not found
  10. 微信开源组件WCDB漫谈及Demo
  11. [unity3d]再次修改socket聊天,完美的服务器端
  12. 如何编写优雅的代码:06. 设计模式应用案例(上)
  13. OpenLayers 绘制,选中,鼠标悬浮
  14. 深度图像配准_巧解图像处理经典难题之图像配准
  15. 从eoeandroid换到CSDN-[回顾]
  16. 和平精英微信和qq不是一个服务器,和平精英qq和微信能一起玩吗 qq微信数据互通吗...
  17. 宇视网络视频录像机添加第三方摄像机的配置方法
  18. iPhonexr安兔兔html5测试,iPhone XR安兔兔跑分数据出炉,跟XS对比相差大吗?
  19. 常见的两种解空间 全排列与幂集
  20. ibm tivoli_使用Tivoli Access Manager的多租户云解决方案中的访问控制最佳实践

热门文章

  1. 端午节 Dragon Boat Festival的由来以及相关词汇
  2. 《C语言编程魔法书:基于C11标准》——3.3 本章小结
  3. html图表设置y轴刻度,如何设置AnyChart Flash图表控件坐标轴元素
  4. java进程老挂掉_JAVA进程突然挂掉
  5. linux下进入目录的命令是什么,linux进入目录的命令是什么
  6. Android设备网络压力测试
  7. 计算机高新技术考试(OSTA)认证考试招生简章
  8. 计算机osta试题,全国计算机信息高新技术(osta)考试项目
  9. MYSQL:2022
  10. java的-json_Java中的JSON