7-6 广度优先和深度优先搜索的一些总结

本文详细介绍了深度优先遍历(DFS)和广度优先遍历(BFS)这两种重要的图论算法,包括它们的概念、实现方式(递归与非递归)、解题步骤以及搜索优化策略如剪枝。强调了搜索算法在问题解决中的枚举性质,并指出DFS常用于竞赛保底,而BFS适用于求最优解。同时,讨论了搜索过程中的状态空间、搜索树、状态转移等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

什么是搜索?搜索用来干什么?

深度优先遍历

深搜过程图解

1、递归实现

2、非递归实现

广度优先遍历 

DFS vs BFS 

搜索的解题步骤

搜索中的常用术语

搜索的一些优化

剪枝

其他的剪枝策略:

习题演练


图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

阅读本文前,请确保你已经掌握了递归、栈和队列的基本知识,如想掌握搜索的代码实现,请确保你能够用代码实现栈和队列的基本操作。

深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search,简称 BFS)是图论中两种非常重要的算法,也是进行更高的算法阶段学习的最后一道门槛。搜索算法频繁出现在算法竞赛题中, 尤其是深度优先搜索,在竞赛中,它是用来进行保底拿分的神器!

本文将会从以下几个方面来讲述深度优先遍历,广度优先遍历,相信大家看了肯定会有收获。

什么是搜索?

搜索用来干什么?

深度优先遍历,广度优先遍历介绍

DFS vs BFS搜索的解题流程

搜索中的常用术语

搜索的一些优化

习题演练

什么是搜索?搜索用来干什么?

注:搜索本质上就是枚举,只不过是一种有策略的枚举

搜索算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。现阶段一般有枚举算法、深度优先搜索、广度优先搜索、A*算法、回溯算法、蒙特卡洛树搜索、散列函数等算法。搜索本质上就是枚举,只不过是一种有策略的枚举, 通常在搜索前,根据条件降低搜索规模;根据问题的约束条件进行剪枝;利用搜索过程中的中间解,避免重复计算这几种方法进行优化 。

搜索算法实际上是根据 初始条件扩展规则 构造一棵“解答树”并寻找符合目标状态的节点的过程。所有的搜索算法从最终的算法实现上来看,都可以划分成两个部分——控制结构(扩展节点的方式)和产生系统(扩展节点),而所有的算法优化和改进主要都是通过修改其控制结构来完成的。我们所熟悉的最常用的搜索算法:深度优先搜索和广度优先搜索就是有两种不同的控制结构(策略)的搜索算法。

其实,在这样的思考过程中,我们已经不知不觉地将一个具体的问题抽象成了一个模型——树,即搜索算法的使用 第一步在于搜索树的建立 。

深度优先遍历

主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底......,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点是不撞南墙不回头,先走完一条路到底,再换一条路继续走。

树是图的一种特例(连通无环的图就是树),接下来我们来看看树用深度优先遍历该怎么遍历。

深搜过程图解

1、我们从根节点 1 开始遍历,它相邻的节点有 2,3,4,先遍历节点 

‘2,再遍历 2 的子节点 5,然后再遍历 5 的子节点 9。2、上图中一条路已经走到底了(9是叶子节点,再无可遍历的节点),此时就从 9 回退到上一个节点 5,看下节点 5 是否还有除 9 以外的节点,没有继续回退到 2,2 也没有除 5 以外的节点,回退到 1,1 有除 2 以外的节点 3,所以从节点

3 开始进行深度优先遍历,如下:3、同理从 10 开始往上回溯到 6, 6 没有除 10 以外的子节点,再往上回溯,发现 3 有除 6 以外的子点 7,所以此时会遍历 7。

4、从 7 往上回溯到 3, 1,发现 1 还有节点 4 未遍历,所以此时沿着 4, 8 进行遍历,这样就遍历完成了。完整的节点的遍历顺序如下(节点上的的蓝色数字代表):

相信大家看到以上的遍历不难发现这就是树的前序遍历

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值