浅析 广度优先遍历(BFS)和深度优先遍历(DFS)

本文详细介绍了图的两种遍历算法——深度优先遍历(DFS)和广度优先遍历(BFS)。DFS利用栈进行递归搜索,适合找路径;BFS借助队列实现,适用于找最近路径。两种算法在有向图、无向图和权重图中各有应用,是图论和数据结构中的基础操作。
摘要由CSDN通过智能技术生成

想要了解广度优先遍历(BFS)和深度优先遍历(DFS)我们需要先了解图的概念。
图的定义:

图在数据结构中是中一对多的关系,一般分为有向图、无向图和权重图。常用 邻接矩阵 或者 邻接链表 来表示图中结点的关系

有向图(Directed Graph):有向图中的相连线是有方向的。
无向图(Undirected Graph):在无向图中,每个顶点和其他顶点通过相连线连接。
权重图(Weighted Graph):在权重图中,每条相连线有各自的权重。

请添加图片描述

圆圈为顶点(vertice)黑色线为相连线(edge)

广度优先遍历(BFS)和深度优先遍历(DFS)都只是在图中寻找符合条件的顶点的方式。

广度优先遍历(Breadth First Search 简称 BFS)

又称宽度优先搜索算法(又称广度优先搜索),属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

请添加图片描述
可以看出,这样放射性的寻找方式,能找到从a到g的最近路(因为每次只走一步,且把所有的可能都走了,谁先到g说明这就是最短路)。
广度优先遍历树,需要用到队列(Queue)来存储节点对象,队列的特点就是先进先出。

广度优先的[递归]伪代码:

把start节点push入队列;
while(队列不为空) {
  把队列首节点pop出队列;
  对节点进行相关处理或者判断;
  while(此节点有下一个相关节点){
    把相关节点push入对列;
  }

}


例子:
请添加图片描述

详解:
从图中的顶点a出发,在访问了a之后依次访问a的各个没有访问到的邻接点
然后分别从这些邻接点出发依次访问他们的邻接点,使得先被访问的顶点的邻接点先与后被访问顶点的邻接点被访问(举例:a->b,b先于c、f被访问),直到图中所有已被访问的顶点的邻接点都被访问到。
如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问到的顶点作为新的起始点,重复上述过程。

深度优先遍历(Depth First Search 简称 DFS)

深度优先遍历是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。

在这里插入图片描述

可以看出,若没有走到死路,这种遍历方式会从a节点沿着一条路一直深入下去,若走到死路,便会退回上一节点,遍历上一节点的其他相邻节点,这样一直重复,直到找到终点。
深度优先遍历各个节点,需要使用到栈(Stack)这种数据结构。stack的特点是是先进后出。

深度优先的[递归]伪代码:

find(节点){
  if(此结点已经遍历 || 此节点在图外 || 节点不满足要求) return;
  if(找到了g节点) 输出结果 ; return;
  标记此节点,表示已经遍历过了;
  while(存在下一个相邻节点) find(下一个节点);
}

例子:
在这里插入图片描述

详解:
我们假设初始状态所有顶点都没被访问,然后从每个顶点a出发,先访问该顶点
然后依次从它的各个未被访问的邻接点出发,深度优先遍历图,知道图中所有的和a相通的顶点都被访问到了
遍历后,还有其他顶点没被访问到,则另选一个未被访问的顶点作为起始点
重复上述过程,知道所有顶点都被访问完为止

感谢各位大佬,如有冒犯请联系删除
图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS
DFS(深度优先遍历) 以及 BFS(广度优先遍历)
有向图,无向图有关概念
图Graph, 深度优先遍历(DFS), 广度优先遍历(BFS)【数据结构和算法入门9】

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值