深度优先搜索(DFS).docx

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

guoxiachuanyue + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档