4月6号总结

马上就是蓝桥杯了,趁着清明节放假我将以前学习过的算法与数据结构复习了一遍,今天的总结就当复习总结吧。

提到蓝桥杯就一定会想起dfs,bfs两种搜索算法,我也将从他们开始。

dfs(深度优先搜索):

dfs是一种图的遍历算法,用一句简单的话来说就是不撞南墙不回头,dfs会沿着一条边走到底直到没有下个顶点位置再返回上个位置继续搜索新的路径。

基本思路:

深度优先遍历图的方法是,从图中某顶点v出发:

(1)访问顶点v;

(2)依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;

(3)若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止

这里附上一个经典的dfs题目:迷宫 - 洛谷

我是十分喜欢dfs的(因为dfs容易剪枝也比较容易想到),两种搜索(dfs,bfs)可不止可以用来走迷宫和遍历图,用他们的思想也可以解决许多问题,这就是我接下来要说的抽象化的搜索。抽象化的dfs可以解决绝大多数问题,这得益于他本身自带的递归性质,举个栗子,给你一个数n,你要将它拆分成不同的数相加并输出所有可能,一些人(比如菜狗我)在看到题目的第一眼并不会想到这是一道dfs的题,这和走迷宫没啥关系啊,但这就是抽象化的dfs,而这个题目也是一个经典题目:自然数的拆分问题 - 洛谷

最后再说说我对dfs的认识(如果我的认识有不对的地方希望可以指出来):dfs的核心思想就是递归和回溯,处理好这两点和在没有时间限制的情况下dfs一定是你解决问题的好方法,dfs一般用来处理多情况讨论的问题,通过列举所有情况去找到你所需要的情况。

bfs(广度优先搜索):

与dfs一样bfs也是一种图的遍历方式,如果说dfs的核心在于递归与回溯用栈实现那bfs就是用队列实现,bfs会先把当前的情况全部处理完毕再开始下一层的搜索看下面这张图

 我们以A为起点用DFS的遍历顺序为:ACFHGDBE或ABECFHGD,而BFS会是:ADCBEFGH,我想这样就能很好理解DFS和BFS的区别了。

bfs可以解决什么问题呢?我们可以看到dfs是按照层次来搜索的,那么用它来解决最小步数问题在适合不过了,这里附上一道bfs的经典例题:马的遍历 - 洛谷。bfs还可以用来处理抽象化问题中的串联关系,比如这道题:

 最后说说我对bfs的认识:bfs是一个用来处理最小步数的好方法,在以宽度优先的情况下bfs比dfs更有时间优势。

还有一个补充内容:记忆化搜索。举一个十分经典的栗子,斐波那契数列,当你用dfs解决它的时候会发现大多数会判定为时间超限,这是为什么呢?我们来分析一下,当你计算F(7)时你会去递归查找F(6)与F(5),F(6)需要F(5)F(4)......,你会发现有很多数字会重复出现但你都要再次递归去把它找寻一次,既然如此为何不用一个数组去把它直接存起来,下次需要它是直接调用呢,这便是记忆化搜索,记忆化搜索是用空间去换取时间的典例,可以根据自己的需要选择使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值