DFS 图遍历路径优化分析「建议收藏」

DFS 图遍历路径优化分析「建议收藏」深度优先搜索是图的遍历的一种重要方法,在一些网络拓补结构、DNA网络等复杂图形分析中有很广泛的应用。传统的深度优先搜索,从某一节点开始,依次遍历此节点所有相邻且未被访问的节点,其下一跳节点的选择往往不是最优的。文章通过对当前节点所有未被访问的下一跳节点计算其到所有未访问节点路径总和,选择最优的一个节点作为下一跳节点,使得深度优先搜索在图的遍历过程中总的搜索路径大大减少。深度优先搜索算法对图的遍历分析图的遍历是指从图的某个节点开始,沿着某条路径对图中所有节点依次访问。解决图的遍历问题,目前主要.

大家好,又见面了,我是你们的朋友全栈君。

深度优先搜索是图的遍历的一种重要方法,在一些网络拓补结构、DNA 网络等复杂图形分析中有很广泛的应用。传统的深度优先搜索,从某一节点开始,依次遍历此节点所有相邻且未被访问的节点,其下一跳节点的选择往往不是最优的。文章通过对当前节点所有未被访问的下一跳节点计算其到所有未访问节点路径总和,选择最优的一个节点作为下一跳节点,使得深度优先搜索在图的遍历过程中总的搜索路径大大减少。

深度优先搜索算法对图的遍历分析

图的遍历是指从图的某个节点开始,沿着某条路径对图中所有节点依次访问。解决图的遍历问题,目前主要有两种算法,广度优先搜索算法和深度优先搜索算法。
深度优先搜索算法基本思想为,首先从图中某个节点 出发, 然后依次从 相邻的节点出发深度优先遍
历,直至图中所有与 路径想通的节点都被访问。若此时尚有节点未被访问,则从中选一个节点作为起点,重复上述过程,直到所有的顶点都被访问。在传统的深度优先搜索算法中,若某个节点包含多个未被访问的节点,一般按照节点编号从小到大依次选择节点作为下一跳节点,算法中对下一跳节点的选择做出的判断往往不是最优的,这就导致了当遍历完所有节点时,总的路径不是最短的。如图 1 为包含 9个节点的无向图。假设从 A 点出发,按照深度优先搜索算法会包含如下两条路径选择,如果每两个联通节点的距离权值为 1,明显可以看出,路径 2 遍历完所有节点花费的代价较小。出现上述问题的原因在于每次节点对相邻未访问节点的选择不同所造成的。
A->D->G->I->G->H->D->A->C->F->E->B(1)
A->B->E->F->C->A->D->H->G->I (2)

DFS 图遍历路径优化分析「建议收藏」

 优化

为了解决 DFS 在图的遍历问题中,由于下一跳节点的选择所带来的路径非最优问题,本文提出了一种下一跳节点选择策略,可以有效的缩短搜索总路径,提高搜索效率。主要思想及过程如下,从图的某一顶点开始遍历,对于该顶点下所有未被访问的子节点,分别计算每个节点到图中剩余未被访问的节点路径总和,选择路径总和最大的节点作为下一跳节点;若该顶点下所有节点都被访过,则计算所有被访问的节点,到剩余未被访问的节点距离总和,选择距离总和最小的节点作为下一跳节点。
为了验证算法的有效性,选择一个包含 26 个节点的无向有权图进行验证,如图 2 所示,分别计算优化前后的两种路径,一种默认使用小节点编号作为下一跳节点,另一种使用本文介绍的下一跳节点选择策略。假定起始点为 22 号节点,结果如下
[22, 20, 19, 2, 1, 2, 4, 23, 24, 9, 25, 26, 15, 18,16, 13, 11, 10, 12, 15, 26, 25, 17, 8, 6, 14, 6, 3, 5, 7, 5,3, 2, 4, 21]
[22, 20, 19, 2, 1, 2, 3, 5, 7, 5, 3, 6, 10, 11, 13, 16,18, 15, 12, 15, 26, 25, 9, 24, 23, 4, 21, 4, 23, 24, 9, 25,17, 8, 17, 25, 26, 15, 18, 16, 13, 11, 15, 11, 10, 12, 10,6, 14, 6, 6, 3, 2, 2, 19, 20, 22]
从计算结果可以看出使用本文提出的优化策略,需要 35 步完成所有节点的遍历,而未进行优化遍历整个图需要 57 步。搜索效率有了明显的提高。图 2 包含 26 个节点的无向有权图

DFS 图遍历路径优化分析「建议收藏」

DFS 作为图的遍历的一种比较成熟的算法,在图的遍历下一跳节点选择的过程中,如果不对节点选择进行策略优化,往往会使最终遍历的总路径增加,使搜索效率下降,速度变慢,本文在 DFS 的基础上,通过对未访问节点计算其到剩余未访问节点距离之和,选取最大值作为下一跳节点,较大的缩减了图的遍历总路径,提高了搜索效率。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131992.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java类加载常见的几种问题理解类加载机制

    java类加载常见的几种问题理解类加载机制类加载过程中的相关概念详见-http://m.myexception.cn/program/1602930.html理解类加载过程的5步。Round1:首先请理解如下代码:classX{Yy=newY();publicX(){System.out.print(“X”);}}classY{publicY(){

    2022年5月12日
    43
  • EVE模拟器教程之如何设置预配[通俗易懂]

    EVE模拟器教程之如何设置预配[通俗易懂]很多时候我们想把EVE所有的配置都清空,但是又想在清空时保存最基本的预配,比如IP地址,Hostname等等,以下为设置预配详细步骤:1)配置好每台设备的IP地址,计算机名,以及你想预配的信息,然后保存。2)选择菜单选项栏Moreactions—ExportallCFGs注意右边消息窗口弹出configexported并且无错误,此导出步骤请重复2-3遍。…

    2022年6月10日
    37
  • C#中Dock属性的作用[通俗易懂]

    C#中Dock属性的作用[通俗易懂]当在C#项目开发中,在窗体界面的设置经常用到Dock属性值。这里一panel面板的Dock属性值为例描述其作用。当容器中的控件的Dock属性设置为Fill时,可能会覆盖其他Dock属性为Top,Bottom,Right,Left的控件。为了避免出现覆盖现象,可以将被覆盖的控件置于底层就可以(在panel面板上“右键”–“置于底层”),如下图所示。应用Dock时,越是底层的控件,其优先级越高。

    2025年10月28日
    4
  • commons-lang里面StringUtils方法说明以及案例

    commons-lang里面StringUtils方法说明以及案例下面总结了StringUtil里面的常用的方法:1.publicstaticbooleanisBlank(Stringstr)在校验一个String类型的变量是否为空时,通常存在3中情况是否为null 是否为"" 是否为空字符串(引号中间有空格)如:""。 制表符、换行符、换页符和回车 StringUtils的…

    2022年6月5日
    28
  • make menuconfig执行报错

    make menuconfig执行报错1、flex:未找到命令解决办法:yuminstallflex2、bison:未找到命令解决办法:yuminstallbison缺什么安装什么,很简单最后再次执行makemenuconfig

    2022年6月3日
    34
  • set_time_limit(0)是什么意思?

    set_time_limit(0)是什么意思?

    2021年10月18日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号