图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)
阅读本文前,请确保你已经掌握了递归、栈和队列的基本知识,如想掌握搜索的代码实现,请确保你能够用代码实现栈和队列的基本操作。
深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search,简称 BFS)是图论中两种非常重要的算法,也是进行更高的算法阶段学习的最后一道门槛。搜索算法频繁出现在算法竞赛题中, 尤其是深度优先搜索,在竞赛中,它是用来进行保底拿分的神器!
本文将会从以下几个方面来讲述深度优先遍历,广度优先遍历,相信大家看了肯定会有收获。
-
什么是搜索?搜索用来干什么?
-
深度优先遍历,广度优先遍历介绍
-
DFS vs BFS
-
搜索的解题流程
-
搜索中的常用术语
-
搜索的一些优化
-
习题演练
什么是搜索?搜索用来干什么?
搜索本质上就是枚举,只不过是一种有策略的枚举
搜索算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。现阶段一般有枚举算法、深度优先搜索、广度优先搜索、A*算法、回溯算法、蒙特卡洛树搜索、散列函数等算法。搜索本质上就是枚举,只不过是一种有策略的枚举, 通常在搜索前,根据条件降低搜索规模;根据问题的约束条件进行剪枝;利用搜索过程中的中间解,避免重复计算这几种方法进行优化 。
搜索算法实际上是根据 初始条件 和 扩展规则 构造一棵“解答树”并寻找符合目标状态的节点的过程。所有的搜索算法从最终的算法实现上来看,都可以划分成两个部分——控制结构(扩展节点的方式)和产生系统(扩展节点),而所有的算法优化和改进主要都是通过修改其控制结构来完成的。我们所熟悉的最常用的搜索算法:深度优先搜索和广度优先搜索就是有两种不同的控制结构(策略)的搜索算法。
其实,在这样的思考过程中,我们已经不知不觉地将一个具体的问题抽象成了一个模型——树,即搜索算法的使用 第一步在于搜索树的建立 。
深度优先遍历
深度优先遍历
主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底......,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点是不撞南墙不回头,先走完一条路到底,再换一条路继续走。
树是图的一种特例(连通无环的图就是