彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

这篇具有很好参考价值的文章主要介绍了彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

深度优先算法

算法的思想,算法步骤,代码实现与分析,最后"debug+图解"展示展开

会有一定的图示,以便于更好的理解(博主的自我思考,如有错误,欢迎指正)

需要源码与相关图解请评论区留言

博客空间https://blog.csdn.net/JOElib?spm=1011.2266.3001.5343文件压缩与解压https://blog.csdn.net/JOElib/article/details/123965081?spm=1001.2014.3001.5501排序算法https://blog.csdn.net/JOElib/article/details/123623176?spm=1001.2014.3001.5501


目录

算法思想🐼 

算法步骤🐼 

DOC注释🐼 

代码实现(核心代码)🐼

1.创建寻找第一个邻接节点的方法🐻

代码分析:🐨

2.创建寻找后一个邻接节点的方法🐻

代码分析:🐨 

3.创建核心DFS(深度优先搜索)的方法🐻

代码分析:🐨

4.对DFS进行重载🐻

代码分析:🐨 

DeBug与图解🐼

结论:


算法思想🐼 

  • 从访问初始节点出发,访问初始节点可能有很多个邻接节点,深度优先算法的策略是首先访问第一个邻接节点,然后再以这个被访问的邻接节点作为访问初始节点,接着访问他的第一个邻接节点
  • 即:每次访问完当前节点首先访问当前节点的第一个邻接节点
  • 不难看出,访问策略往纵向发掘深入,而不是对一个节点的所有邻接节点进行访问
  • 显然,深度优先搜索算法是一个递归的过程

算法步骤🐼 

  1.  访问初始节点v,并将该节点标记为已读
  2.  查找初始节点的第一个邻接节点w
  3.  如果邻接节点w存在,则执行4,若不存在,则返回-1,从v的下一个未访问的节点继续
  4.  若w未被访问,对w进行深度优先搜索递归(即把w当作另一个v,然后再进行123)
  5.  若w被访问,查找节点v的w的下一个邻接节点,转到3

DOC注释🐼 

彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

请认真查阅Javadoc注释,否则无法看得懂下面的代码的目的 


代码实现(核心代码)🐼

1.创建寻找第一个邻接节点的方法🐻

public int getFirstVertex(int index) {
        for (int i = 0; i < vertexList.size(); i++) {
            if (edges[index][i] > 0) {
                return i;
            }
        }
        return -1;
    }

代码分析:🐨

  1. 通过邻接矩阵我们就可以得到各节点之间边的权值,根据权值我们就可以得到其邻接节点,故,我们需要用到邻接矩阵这个二维数组
  2. for循环的详解:
    1. i初始化为0的目的是:"找到第一个邻接节点"这句话得出,为了保证第一,所以要从下标为0的元素开始遍历
    2. i<vertexList.size()的目的是:在元素内遍历,防止空指针异常;即,将所有的元素遍历一遍
    3. 如果edges[index][i] > 0,说明有边,为当前下标元素的邻接节点,返回该节点下标
  3. 如果循环后没有返回任何数据,说明该节点没有任何邻接节点,直接返回-1

2.创建寻找后一个邻接节点的方法🐻

public int getVertexByLast(int v1,int v2) {
        for (int i = v2 + 1; i < vertexList.size() ; i++) {
            if (edges[v1][i] > 0) {
                return i;
            }
        }
        return -1;
    }

代码分析:🐨 

  1. 方法说明:该方法本质意思是找到当前节点的下一个邻接节点(如:JKL是他的邻接节点,第一次找到J,则调用该方法就会找到K)
  2. for循环的详解
    1. i = v2+1,其原因是"找到下一个邻接节点",如果将i赋值为v2,v2就是v1的一个邻接节点,直接返回,造成死循环,所以,找到他下一个邻接节点至少从他的下一个位置开始,切必须从该位置开始
    2.  i<vertexList.size()的目的是:在元素内遍历,防止空指针异常;即,将所有的元素遍历一遍
  3. 同理方法1后面的几句话

3.创建核心DFS(深度优先搜索)的方法🐻

该方法严格遵守算法步骤执行 

private void dfs(boolean[] isVisited,int v) {
        System.out.println(getItem(v));
        isVisited[v] = true;
        var w = getFirstVertex(v);
        while (w != -1) {
            if (!isVisited[w]) {
                dfs(isVisited, w);
            }
            w = getVertexByLast(v,w);
        }
        dfs();
    }

代码分析:🐨

  1.  先输出当前节点对应的数据
  2.  并将该节点标记成已读
  3.  获取当前节点的第一个邻接节点
  4.  若该邻接节点存在,则进入循环
  5.  若该邻接节点未被读取,则递归进入,继续进行DFS(深度优先)
  6.  否则找到下一个邻接节点,继续判断是否被读取
  7.  如果该邻接节点不存在,则寻找下一个未被读取的节点

4.对DFS进行重载🐻

@First("The DFS should be firstly invoked")
public void dfs() {
        for (int i = 0; i < vertexList.size(); i++) {
            if (!isVisited[i]) {
                dfs(isVisited,i);
            }
        }
}

代码分析:🐨 

  1.  该方法的目的是:寻找一个未被读取的节点,为了方便算法,我们默认从下标为0的节点开始
  2.  如果未被读取,则调用3方法,这个方法就实现了算法找不到邻接节点时所需要的操作

DeBug与图解🐼

彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)
以该"图"展开分析
彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)
对应的邻接矩阵(ABCDE下标对应01234)

  

彻底搞懂图的深度优先算法(Debug+图解+JavaDOC) 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

彻底搞懂图的深度优先算法(Debug+图解+JavaDOC) 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

彻底搞懂图的深度优先算法(Debug+图解+JavaDOC) 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

彻底搞懂图的深度优先算法(Debug+图解+JavaDOC) 同理得出"C"第一次找到的邻接节点是"A",第二次是"B",直到这一步

 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

 彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)

彻底搞懂图的深度优先算法(Debug+图解+JavaDOC) debug结束,剩余的逻辑与以上的逻辑一致,相信友友们可以自行解决


结论:

         DFS算法比较抽象,不知道这种讲述方式大家能否可以接受,我来总结一下必须要掌握的几点:

        1.算法步骤如何进行

        2.算法思想如何理解(重点理解为什么是纵向深入)

        3.算法如何构建

        🚇下一站:图的广度优先算法文章来源地址https://www.toymoban.com/news/detail-402396.html

到了这里,关于彻底搞懂图的深度优先算法(Debug+图解+JavaDOC)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    图的遍历指从图中某一顶点出发(任意一个顶点都可以作为访问的起始顶点),按照某种遍历方法,对图中所有的顶点访问一次且只访问一次。图与树不一样,其中一个顶点可能与多个顶点相连,所以需记录已访问过的顶点,当访问一个顶点后,考虑如何选取下一个要访问的

    2024年02月05日
    浏览(51)
  • 算法数据结构——图的遍历之深度优先搜索算法(Depth First Search)

    深度优先搜索算法 (Depth First Search):英文缩写为 DFS。是一种用于搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。 深度优先搜索采用了回溯思想,该算法沿着树的深度遍历树的节点,会尽可能深的搜索树的分支。当节点 v 的所在边都己被探寻过,搜

    2024年02月09日
    浏览(48)
  • 【数据结构与算法】图的基本概念 | 邻接矩阵和邻接表 | 广度优先遍历和深度优先遍历

    🌠 作者:@ 阿亮joy. 🎆 专栏:《数据结构与算法要啸着学》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 图是由顶点集合及顶点间的关系组成的一种数据结构:G = (V, E) ,其中: 顶点集合V = {x|x属于某

    2024年02月04日
    浏览(69)
  • 蛮力算法之深度优先遍历和广度优先遍历——图的深度优先遍历和广度优先遍历,附带案例:迷宫问题及矩阵中传染性传播问题

    这两种搜索方法本质上都是基于蛮力法思路 这两种搜索方法对有向图和无向图都适用 1.1 邻接矩阵 邻接矩阵示意图: 1.2 邻接表 注意:边结点代表的是图中的边,而并非图中的结点;头结点才表示图中的结点;头结点身后所连接的为边结点 邻接表示意图:(一般默认为出边

    2024年02月05日
    浏览(65)
  • 数据结构与算法基础-学习-24-图的遍历之DFS(深度优先搜索)和BFS(广度优先搜索)

    目录 一、遍历定义 二、遍历实质 三、DFS 四、BFS 五、宏定义 六、自定义类型 七、函数实现 1、DFS(邻接矩阵实现) 2、DFS(邻接表实现) 3、BFS(邻接矩阵实现) 4、BFS(邻接表实现) 5、打印邻接矩阵遍历顺序  6、打印邻接表遍历顺序 八、遍历算法效率分析 1、DFS 2、BFS 九

    2024年02月03日
    浏览(73)
  • 【算法导论】图论(图的基本概念,图上的深度优先搜索(DFS),广度优先搜索(BFS),最小生成树(MST)及Prim,Kruskal算法)

    图(Graph)是一种包含节点与节点的边的集合,记作G=(V,E),V是节点的集合,E是边的集合。 有向图 一个有向图G=(V,E),E中每个元素是V上的一个二值关系:一条从a出发的连向b的边e可以记作一个 有序 对e = (a,b) 。 无向图 一个无向图G=(V,E),E的每个元素e可以表示V上的一个 无序 对,记

    2024年02月03日
    浏览(50)
  • 一文彻底搞懂BJT及其放大特性(图解说明)

    前置知识:PN结 一文彻底搞懂PN结及其单向导电性(图解说明)-CSDN博客 BJT的基本结构如上图所示,在左侧是宽度较窄,浓度非常高的N型离子参杂。中间是非常窄的P型离子参杂。而左侧是浓度较低的N型离子参杂。 在N型参杂区和P型参杂区之间会形成PN结,因此BJT实际上内部是

    2024年02月08日
    浏览(40)
  • 一文帮你彻底搞懂ARM Debug Interface之SWD(转)

    芯片验证日记 芯片验证工程师 32 人赞同了该文章 一文帮你彻底搞懂ARM Debug Interface之SWD - 知乎 0. 前言 ARM的文档写的已经很好了,但是关于上电以后的第一时间应该怎么操作,依然写的不够清晰,导致我第一次用的时候还是费了一些周折。今天做一个详细的梳理,希望能够帮

    2024年02月19日
    浏览(41)
  • 图的广度优先遍历和深度优先遍历

    前言:在上一篇博客我们学习了图的基本操作,包括图的建立、结点插入与删除等操作,怎么判断我们建立的图是否正确,很简单把它输出出来就是,但是如何输出它,这就是图的遍历问题了。 图的遍历是指从图中的某一顶点出发,按照某种搜索方法沿着图中的边对图中的所

    2024年02月11日
    浏览(50)
  • 图的遍历——深度优先遍历与广度优先遍历

    目录 何谓遍历? 图的遍历特点 图的遍历方式 深度优先搜索 过程分析 案例分析: 算法的代码实现  测试案例: 测试结果如下: 遍历非连通图 算法复杂度分析 额外补充 广度优先搜索 过程分析 辅助队列 算法的代码实现 队列部分 广度搜索部分 测试案例: 测试结果: 非连

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包