- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
For pers onal use only in study and research; not
for commercial use
深度优先搜索(DFS)
【算法入门】
刖言
深度优先搜索(缩写 DFS )有点类似广度优先搜索,也是对一个连通图进行遍历的算法。 它的思想是从一个顶点 V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就 返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的 概念。
你可以跳过第二节先看第三节, :)
深度优先搜索VS广度优先搜索
2.1演示深度优先搜索的过程
还是引用上篇文章的样例图,起点仍然是 V0,我们修改一下题目意思,只需要让你找出
条V0到V6的道路,而无需最短路。
图2-1寻找V0到V6的一条路(无需最短路径)
假设按照以下的顺序来搜索:
V0-V1-V4,此时到底尽头,仍然到不了 V6,于是原路返回到 V1去搜索其他路径;
返回到V1后既搜索V2,于是搜索路径是 V0-V1-V2-V6, ,找到目标节点,返回有解。 这样搜索只是2步就到达了,但是如果用 BFS的话就需要多几步。
2.2深度与广度的比较
(你可以跳过这一节先看第三节,重点在第三节)
从上一篇《【算法入门】广度/宽度优先搜索(BFS)》中知道,我们搜索一个图是按照树的 层次来搜索的。
我们假设一个节点衍生出来的相邻节点平均的个数是 N个,那么当起点开始搜索的时候,
队列有一个节点,当起点拿出来后,把它相邻的节点放进去,那么队列就有 N个节点,当
下一层的搜索中再加入元素到队列的时候,节点数达到了 N2,你可以想想,一旦 N是一个
比较大的数的时候,这个树的层次又比较深,那这个队列就得需要很大的内存空间了。
于是广度优先搜索的缺点出来了:在树的层次较深 子节点数较多的情况下,消耗内存十分
严重。广度优先搜索适用于节点的子节点数量不多,并且树的层次不会太深的情况。
那么深度优先就可以克服这个缺点, 因为每次搜的过程,每一层只需维护一个节点。但回过
头想想,广度优先能够找到最短路径, 那深度优先能否找到呢?深度优先的方法是一条路走
到黑,那显然无法知道这条路是不是最短的,所以你还得继续走别的路去判断是否是最短
路?
于是深度优先搜索的缺点也出来了: 难以寻找最优解,仅仅只能寻找有解。其优点就是内存
消耗小,克服了刚刚说的广度优先搜索的缺点。
深度优先搜索
举例
图3-1
显然,我们知道是有这样一个解的: V0-V3-V5-V6
处理过程
VO■
VO
■ 110-C节丰中睜7 S 已咗 F于內可兀节占了
V4 b
D
从也相却的节占是也」鹉栓力河、于4 ,醴迂桂于 —
^3
卜4侣旳节卓已疑无丰近冋节刁「退回到丫3世養捷专
O
1 V0 fvi
V3T-T1S^m^V5 ,裔^沏于弱 芒注闾事
V5 ( V6
z (5^\
砖下一 \相丁讦?艺是% ’跖径=4.:h剽科”
33对应例子的伪代码
这里先给出上边处理过程的对应伪代码。
I /**
二 * DFS核心伪代码
*前置条件是visit 数组全部设置成false
* @param n 当前开始搜索的节点
* @param d 当前到达的深度,也即是路径长度
* @return 是否有解
*/
bool DFS(Node n, int d){
9
if (d == 4){ //路径长度为返回true,表示此次搜索有解
10
return true ;
11
12
}
13
for (Node nextNode in n){
//遍历跟节点n相邻的节点nextNode ,
14
if (!visit[nextNode]){
//未访问过的节点才能继续搜索
15
16
//例如搜索到V1 了,
那么V1要设置成已访问
17
visit[nextNode]=
true ;
IS
19
//接下来要从V1开始继续访问了,路径长度当然要加
20
21
if (DFS(nextNode, d+1)){ // 如果搜索出有解
22
//例如到了 V6,
找到解了,你必须一层一层递归的告诉上层已经找到解
23
return true ;
}
//重新设置成未访问,
因为它有可能岀现在下一次搜索的别的路径中
27
visit[nextNode]=
false ;
}
30
//到这里,发现本次搜索还没找到解,那就要从当前节点的下一个节点开始搜索。
引
}
return false ; //本次搜索无解
33
}
3.4.DFS函数的调用堆栈
此后堆栈调用返回到 V0那一层,因为 V1那一层也找不到跟 V1的相邻未访问节点
此后堆栈调用返回到 V3那一层
MSO炖叭 论归晒J DF5{V 1)曄叮匪甬j DFS(V5. 2) J扫睥
文档评论(0)