2022/1/12总结

DFS的学习

DFS的理解就像人处在一个迷宫中一样,需要靠自己一步步地去走,但是,DFS更像是一种走出迷宫的方法,我们在走迷宫的时候可以一直贴着右边的墙壁走,虽然碰到死路会一条路走到底,但是仔细想想,这种方法是可行的,因为我们还能贴着墙走出来,一但发现是死路可以贴着右墙原路返回到最初的岔路口,再选择其他的岔路走下去,虽然看上去荒谬,但是实际上是十分可行的。

例如:

 如图所示,从入口进入后,当碰到岔路口时,我们可以靠着右墙走,如果碰到新的岔路口,继续沿着新的岔路口的右墙走,碰到死路就退回到最近的岔路口再选择另一条岔路口继续。这个过程中,始终是右边优先,且返回的条件取决于是否到达一条死路,这则是“深度”。这样的一种搜索方式被称为深度优先搜索(即DFS)。

那么如何来实现呢,从图中可以很明显的看出

1.第一条路先后访问的结点为ABK,在这时,K到了死路,所以退回到B。

2.接着,从B开始,依次经过CD,D到达死路,返回C,C->E仍然为死路,返回A.

3.同样的,从A开始,选择另一条岔路,到F分岔,到H为死路,再回到F,从F再到G,G分岔,到I又为死路,返回G,从G到J,走出迷宫。

可以看得出来,虽然荒诞,但是这种方法确实可行(突然就掌握了走迷宫的诀窍呢)。

我们再看看,满足就继续,不满足则返回,这与递归是不是有些相似,我们可以从递归的角度来理解DFS(其实栈也是,但是还不熟练,而且从递归的角度来讲更加容易理解)。大家还记得斐波那契数列吧,这是一道经典的递归的题,F(0)=1,F(1)=1,F(n)=F(n-1)+F(n-2).当F(n)分为F(n-1)和F(n-2)时,此时的F(n)就是一个岔路口,通过它可以到达F(n-1)和F(n-2)这两个结点,之后在进行F(n-1)和F(n-2)的计算时,又可以将F(n-1)和F(n-2)当成两个新的岔路口继续下去,当访问到F(0)和F(1)时,就为死路,这样来看,递归式为岔路口,递归边界为死路,DFS也好理解一些了。

        但是正如之前所说,DFS有多种实现的方法,递归只是其中较为便捷的方法而已,总之,DFS还有许多值得去探索和深思的地方,我还得继续加油。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值