1

[TOCM]

BFS & DFS 学习整理


1 . BFS

定义

BFS (Breadth-First-Search) ——广度优先搜索, 是从根节点开始,遍历完毕整张图,不考虑结果所在的位置, 无论如何都要遍历完毕整张地图才终止。 按照就近原则进行, 距离原点相同的节点的访问顺序是相近的。

BFS 的使用范围

  • 1、寻找非加权图(或者所有边权重相同)中任两点的最短路径。
  • 2、寻找其中一个连通分支中的所有节点。(扩散性)
  • 3、bfs染色法判断是否为二分图。

几点说明

  • 当在无权地图中寻找最短的路径的时候,不用出现大小比较,因为寻找自起点开始, 只要找到了某一个点,他一定是目前相同步数中距离起点最近的,因为每一步都是从同一个节点开始 ,按照节点出现的顺序(queue记录)去寻找的, 所以先出现的点,一定比后出现的点距离原点近。
  • BFS使用 ’queue‘ 来进行储存未被检测的节点,利用 队列的先进先出的特点来按照宽度访问查找等待计算的节点。
  • BFS 实现路径记录,可以每一次保存遍历节点的父节点,这样的话,在输出的时候就可以遍历回溯到上一节点,从而实现路径输出。

2 . DFS

定义

DFS (Depth-First-Search)——深度优先搜索,是从根节点开始, 逐个访问每一条路径, 对于具有多子节点的节点而言,先搜索到某一条子路的最深处,再逐个回溯前驱节点。

DFS 使用栈保存未被检测的节点,节点按照深度优先的次序被访问并依次被压入栈中,并以相反的次序出栈进行新的检测。

几点说明

  • DFS使用 栈(stack) 这一种数据结构来储存未访问的节点。

DFS 与 BFS的 节点储存方式

在DFS中, 使用 队列储存节点, 而在BFS 中,使用 栈储存节点。原因就在于二者 优先次序的不同。

队列是一种先进先出的数据结构,对于每一个节点而言,每一次搜索,都是优先这一个节点的子节点,所以每一次加入等待序列之后,都要等到某一个节点的所有子节点都被访问完毕, 才可以进行下一个节点的访问,这正好是,先进入等待序列 的节点,先出序列进行计算,而后进入的,则后出,所以使用队列储存。
栈是一种先进后出的数据结构,在DFS中,我们要对每一条路径走到底,才可以回溯前驱节点,所以当节点加入等待序列之后,都要先让后加入的(也就是子节点中的某一个) 节点先进行运算, 以保证是一条路走到底,所以符合栈的设计。


FancyKing
8 声望0 粉丝