算法笔记——DFS深度优先搜索

DFS深度优先搜索

1、理解

现在我们先想象以第一视角处于一个巨大的迷宫中(如下图所示),没有任何辅助,也没有什么上帝视角,假设迷宫只有一个入口和一个出口,那么如何才能一定走得出去?有个方法,只沿着右手边的墙走。遇到岔路口,选择其中一个路口继续前进,可以理解为以深度作为前进的关键词,不碰到死胡同就不回头,因此把这种搜索的方式成为深度优先搜索(Depth First Search,DFS)
从迷宫的例子可以注意到,深度优先搜索是一种枚举完所有完整路径以遍历所有情况的搜索方法

DFS迷宫示意图
在上面的DFS迷宫中,整个DFS过程访问结点的顺序是ABDHIJEKLMCFG。在这个过程中,每一小步都可以作为进栈出栈来表示。因此,在分析问题时,可以先得到分岔和死胡同,再定义一个栈,以深度为关键词访问这些关键词和死胡同,并将它们入栈,而当离开这些岔道口和死胡同时,将它们出栈。这听起来很容易,但是实现起来并不轻松,一个比较方便的方法就是使用递归。

2、一个典型例子:Fibonacci数列

求解的Fibonacci数列,F(0)=1, F(1)=1, F(n)=F(n-1)+F(n-2) (n≥2)
这个例子中可以将F(n)看成分叉,把F(n-1)和F(n-2)看做其下的两个岔路口,依次递推,直到遇到死胡同F(0)和 F(1)。

3、烤鸡例题的DFS解法

使用递归可以很好的实现DFS,另外在烤鸡问题中介绍了直接使用循环,暴力枚举实现,其本质就是出栈和入栈的操作,使用递归是一种较为方便的实现DFS的方法,在使用递归时,系统会调用一个叫系统栈的东西来存放每一层的状态。

4、根据两个例子尝试理解贪心算法和深度优先算法的区别

淘淘摘苹果的例题和揹包问题来说:
揹包问题
前者已知所有苹果的高度,身高限制,只需要考虑摘不同高度的苹果所消耗的体力不同,而后者揹包问题既要考虑到物品的价值,也好考虑到物品占据揹包的容量;
前者的未知属性主要集中在不知道先后摘哪些苹果,,未知属性只有一种,而后者揹包问题的价值和容量两个属性都绑定在物品上,也就是说选择一个物品就相当于选择了两个属性,两个变量,前者选择苹果只是选择了一个变量(消耗的体力)
贪心算法的关键一点就是可以用数学归纳法证明出局部最优就是全局最优,而后者DFS似乎不可以,所以可以考虑暴力枚举出所有情况,即使用深度优先搜索的方式求解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章