lisp遍历表中所有顶点_三十张图片让你彻底弄明白图的两种遍历方式:DFS和BFS...

1 引言

  遍历是指从某个节点出发,按照一定的的搜索路线,依次访问对数据结构中的全部节点,且每个节点仅访问一次。
  在二叉树基础中,介绍了对于树的遍历。树的遍历是指从根节点出发,按照一定的访问规则,依次访问树的每个节点信息。树的遍历过程,根据访问规则的不同主要分为四种遍历方式:
  (1)先序遍历
  (2)中序遍历
  (3)后序遍历
  (4)层次遍历
  类似的,图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。遍历过程中得到的顶点序列称为图遍历序列
  图的遍历过程中,根据搜索方法的不同,又可以划分为两种搜索策略:
  (1)深度优先搜索(DFS,Depth First Search)
  (2)广度优先搜索(BFS,Breadth First Search)

2 深度优先搜索

2.1 算法思想

  深度优先搜索思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

2.2 算法特点

  深度优先搜索是一个递归的过程。首先,选定一个出发点后进行遍历,如果有邻接的未被访问过的节点则继续前进。若不能继续前进,则回退一步再前进,若回退一步仍然不能前进,则连续回退至可以前进的位置为止。重复此过程,直到所有与选定点相通的所有顶点都被遍历。
  深度优先搜索是递归过程,带有回退操作,因此需要使用栈存储访问的路径信息。当访问到的当前顶点没有可以前进的邻接顶点时,需要进行出栈操作,将当前位置回退至出栈元素位置。

2.3 图解过程

2.3.1 无向图深度优先搜索

以图2.3.1.1中所示无向图说明深度优先搜索遍历过程。

b1d7e0362bbb48a6c90cd554c5aa1276.png

图2.3.1.1

(1)首先选取顶点A为起始点,输出A顶点信息,且将A入栈,并标记A为已访问顶点。

(2)A的邻接顶点有C、D、F,从中任意选取一个顶点前进。这里我们选取C顶点为前进位置顶点。输出C顶点信息,将C入栈,并标记C为已访问顶点。当前位置指向顶点C。

(3)顶点C的邻接顶点有A、D和B,此时A已经标记为已访问顶点,因此不能继续访问。从B或者D中选取一个顶点前进,这里我们选取B顶点为前进位置顶点。输出B顶点信息,将B入栈,标记B顶点为已访问顶点。当前位置指向顶点B。

(4)顶点B的邻接顶点只有C、E,C已被标记,不能继续访问,因此选取E为前进位置顶点,输出E顶点信息,将E入栈,标记E顶点,当前位置指向E。

(5)顶点E的邻接顶点均已被标记,此时无法继续前进,则需要进行回退。将当前位置回退至顶点B,回退的同时将E出栈。

(6)顶点B的邻接顶点也均被标记,需要继续回退,当前位置回退至C,回退同时将B出栈。

(7)顶点C可以前进的顶点位置为D,则输出D顶点信息,将D入栈,并标记D顶点。当前位置指向顶点D。

(8)顶点D没有前进的顶点位置,因此需要回退操作。将当前位置回退至顶点C,回退同时将D出栈。

(9)顶点C没有前进的顶点位置,继续回退,将当前位置回退至顶点A,回退同时将C出栈。

(10)顶点A前进的顶点位置为F,输出F顶点信息,将F入栈,并标记F。将当前位置指向顶点F。

(11)顶点F的前进顶点位置为G,输出G顶点信息,将G入栈,并标记G。将当前位置指向顶点G。

(12)顶点G没有前进顶点位置,回退至F。当前位置指向F,回退同时将G出栈。

(13)顶点F没有前进顶点位置,回退至A,当前位置指向A,回退同时将F出栈。

(14)顶点A没有前进顶点位置,继续回退,栈为空,则以A为起始的遍历结束。若图中仍有未被访问的顶点,则选取未访问的顶点为起始点,继续执行此过程。直至所有顶点均被访问。

(15)采用深度优先搜索遍历顺序为A->C->B->E->D->F->G。

2.3.2 有向图深度优先搜索

以图2.3.2.1中所示有向图说明深度优先搜索遍历过程。

95542991a78596cb2a9b64fc429a7a05.png

图2.3.2.1 有向图

(1)以顶点A为起始点,输出A,将A入栈,并标记A。当前位置指向A。

(2)以A为尾的边只有1条,且边的头为顶点B,则前进位置为顶点B,输出B,将B入栈,标记B。当前位置指向B。

(3)顶点B可以前进的位置有C与F,选取F为前进位置,输出F,将F入栈,并标记F。当前位置指向F。

(4)顶点F的前进位置为G,输出G,将G入栈,并标记G。当前位置指向G。

(5)顶点G没有可以前进的位置,则回退至F,将F出栈。当前位置指向F。

(6)顶点F没有可以前进的位置,继续回退至B,将F出栈。当前位置指向B。

(7)顶点B可以前进位置为C和E,选取E,输出E,将E入栈,并标记E。当前位置指向E。

(8)顶点E的前进位置为D,输出D,将D入栈,并标记D。当前位置指向D。

(9)顶点D的前进位置为C,输出C,将C入栈,并标记C。当前位置指向C。

(10)顶点C没有前进位置,进行回退至D,回退同时将C出栈。

(11)继续执行此过程,直至栈为空,以A为起始点的遍历过程结束。若图中仍有未被访问的顶点,则选取未访问的顶点为起始点,继续执行此过程。直至所有顶点均被访问。

2.4 算法分析

  当图采用邻接矩阵存储时,由于矩阵元素个数为n^2,因此时间复杂度就是O(n^2)。
  当图采用邻接表存储时,邻接表中只是存储了边结点(e条边,无向图也只是2e个结点),加上表头结点为n(也就是顶点个数),因此时间复杂度为O(n+e)。

3 广度优先搜索

3.1 算法思想

  广度优先搜索思想:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。

3.2 算法特点

  广度优先搜索类似于树的层次遍历,是按照一种由近及远的方式访问图的顶点。在进行广度优先搜索时需要使用队列存储顶点信息。

3.3 图解过程

3.3.1 无向图的广度优先搜索

例如:图3.3.1.1所示的无向图,采用广度优先搜索过程。

cad6f03e033551c53d319b0d1a25da2b.png

图3.3.1.1

(1)选取A为起始点,输出A,A入队列,标记A,当前位置指向A。

aaa4816025ff88bea2e1c765534acd70.png

(2)队列头为A,A出队列。A的邻接顶点有B、E,输出B和E,将B和E入队,并标记B、E。当前位置指向A。

6719aebfd09a8e95b7f54611a8f5fd0d.png

(3)队列头为B,B出队列。B的邻接顶点有C、D,输出C、D,将C、D入队列,并标记C、D。当前位置指向B。

f5b73d2997e6645163c5844899d07c45.png

(4)队列头为E,E出队列。E的邻接顶点有D、F,但是D已经被标记,因此输出F,将F入队列,并标记F。当前位置指向E。

b546032d200d34f5e9da5ace196d083b.png

(5)队列头为C,C出队列。C的邻接顶点有B、D,但B、D均被标记。无元素入队列。当前位置指向C。

29a9c008cf31746c7dafaf5be77e1a4c.png

(6)队列头为D,D出队列。D的邻接顶点有B、C、E,但是B、C、E均被标记,无元素入队列。当前位置指向D。

fdcdb7f77e399e490e72157dd33143e5.png

(7)队列头为F,F出队列。F的邻接顶点有G、H,输出G、H,将G、H入队列,并标记G、H。当前位置指向F。

0d5d7222adaaeac6adce141d862dfd9a.png

(8)队列头为G,G出队列。G的邻接顶点有F,但F已被标记,无元素入队列。当前位置指向G。

0d0c62c8c311f285cdefae9981af9f74.png

(9)队列头为H,H出队列。H的邻接顶点有F,但F已被标记,无元素入队列。当前位置指向H。

b09d40849351ac3166f6fc13a0cd1f62.png

img

(10)队列空,则以A为起始点的遍历结束。若图中仍有未被访问的顶点,则选取未访问的顶点为起始点,继续执行此过程。直至所有顶点均被访问。

3.3.2 有向图的广度优先搜索

以图3.3.2.1所示的有向图为例进行广度优先搜索。

f49298ed95e6b978a71d787832e31477.png

3.3.2.1

(1)选取A为起始点,输出A,将A入队列,标记A。

10fd81bc502df88ebf80cdd037a39b5a.png

(2)队列头为A,A出队列。以A为尾的边有两条,对应的头分别为B、C,则A的邻接顶点有B、C。输出B、C,将B、C入队列,并标记B、C。

f53bc7b7974d393bbf6d4cb2abafcb7f.png

(3)队列头为B,B出队列。B的邻接顶点为C,C已经被标记,因此无新元素入队列。

4bdb74155118f482540dac2081170c26.png

(4)队列头为C,C出队列。C的邻接顶点有E、F。输出E、F,将E、F入队列,并标记E、F。

3485ba66b34728d0511bc6370d5dbffd.png

(5)队列头为E,E出队列。E的邻接顶点有G、H。输出G、H,将G、H入队列,并标记G、H。

1a3e34c7e4abb714f68f7ccea84ede43.png

(6)队列头为F,F出队列。F无邻接顶点。

db36e77559f02389e4011b09a191c498.png

(7)队列头为G,G出队列。G无邻接顶点。

3c079384a1147eb9d4435227d05f6fef.png

(8)队列头为H,H出队列。H邻接顶点为E,但是E已被标记,无新元素入队列。

86bbd55bdbc9bc854c9b277b10650bea.png

(9)队列为空,以A为起始点的遍历过程结束,此时图中仍有D未被访问,则以D为起始点继续遍历。选取D为起始点,输出D,将D入队列,标记D。

2d4ef5b0666390b748d6cf57ff9985a3.png

(10)队列头为D,D出队列,D的邻接顶点为B,B已被标记,无新元素入队列。

defb8ab1872e66337aab4c91e7abe55d.png

(11)队列为空,且所有元素均被访问,广度优先搜索遍历过程结束。广度优先搜索的输出序列为:A->B->E->C->D->F->G->H。

3.4 算法分析

  假设图有V个顶点,E条边,广度优先搜索算法需要搜索V个节点,时间消耗是O(V),在搜索过程中,又需要根据边来增加队列的长度,于是这里需要消耗O(E),总得来说,效率大约是O(V+E)。

4 总结

  图的遍历主要就是这两种遍历思想,深度优先搜索使用递归方式,需要栈结构辅助实现。广度优先搜索需要使用队列结构辅助实现。在遍历过程中可以看出,对于连通图,从图的任意一个顶点开始深度或广度优先遍历一定可以访问图中的所有顶点,但对于非连通图,从图的任意一个顶点开始深度或广度优先遍历并不能访问图中的所有顶点。

日常推荐

漫话:如何给女朋友解释什么是Git和GitHub?

阿广自掏腰包,赠送8套鼠标键盘

年薪80+万的大数据开发全套教程,都在这儿!

今日问题

图有的两种遍历方式是什么?各种的优缺点是什么?

打卡格式:打卡第n天,答:xxx

给个在看,代码无 Bug??

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

未来教育计算机二级预测c,二级C语言(附光盘)(全国计算机等级考试预测试卷与真考题库)...

摘要:高质量预测试卷 首创命题模拟系统,专家层层把关,瞄准每年的更新试题 最新版无纸化考试题库 提供1035道题,所有试题均有正确答案与详尽解析 无纸化真考模拟系统 操作环境,评分机制与真实考试系统的完全一致,带您提前"进入"考场 名师视频课堂 机考误区…

通用测试用例大全

为方便平时写测试用例,整理如下: 功能条件测试步骤测试数据预期结果备注搜索或查询 单独遍历各查询条件,测试按各查询条件是否都能够查询出相应的值. 查询出符合条件的记录 设置界面上所有查询条件进行查询,单击查询按钮后,测试执…

cαr怎么发音_【英语拼读发音规则】连读、略读、重读、断句、语调……

在说汉语的时候,我们讲究的是“字正腔圆、掷地有声”,而英语恰恰相反,它需要将一句话中的某些重点词汇突出,弱化非重点词汇。所以,对已经习惯了“字正腔圆”的我们来讲,就会觉得英语听起来“太含含糊糊”了…

中职计算机英语c答案,中职高考计算机试题及答案-20210622105004.docx-原创力文档...

* 1.计算机采用“存储程序”原理的提出者是()A.莫尔B.比尔盖茨C.冯 诺依曼D.科得2.下列表示计算机运行速度的是()A. 7200转B. 2GHZC. 20GD. 1024 x 768像素(l00101 ) 2 对应的十进制数是( )A. 3…

WEB网站测试思路

1、链接测试:a:进入页面后点击链接是否正常跳转 b:单独将链接复制到浏览器里面是否正常展示页面(如果需要登录的网站,还需要考虑个人中心等需要登录的功能在未登录成功时以及登录成功后直接通过链接打开的情况) 2、菜单测试&#…

计算机病毒属于什么类工具,什么是计算机病毒?有哪些类型

病毒定义一、计算机病毒(Computer Virus)在《中华人民共和国计算机信息系统安全保护条例》中被明确定义,病毒指“编制或者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或者程序代码”。而在一般教科…

织梦缩略图自动补齐绝对路径_[教程]织梦CMS缩略图和文章内容图片自动转化为带域名的绝对路径...

今天又接了个织梦CMS的有偿服务,客户想要后台添加文章内容的时候,缩略图自动变成带上绝对路径的格式.比如我们默认的缩略图是这样的 /uploads/allimg/150814/123P2NB-0-lp.png 他想要的效果是这样的 http://fcz8k.com/uploads/allimg/150814/123P2NB-0-lp.png大家懂我意思了吧…

Net学习日记_ASP.Net_MVC_新语法笔记

01.新语法 本章中主要讲解.Net框架性语法。开发者可以使用新语法提高编程的效率以及代码的运行效率;其本质都是“语法糖”,由编译器在编译时转成原始语法。 1 自动属性 Auto-Implemented Properties 2 隐式类型 var 3 对象初始化器 与 集合初始化器 { …

燕山大学数字通信计算机仿真代码,燕山大学数字通信计算机仿真课程设计模板.doc...

??数字通信计算机课设??程序代码?//?SigTranmit.cpp:?implementation?of?the?SigTranmit?class.?//?//??#include?"stdafx.h"?#include?"ASK.h"?#include?"SigTranmit.h"?#include???#ifdef?_DEBUG?#undef?THIS_FILE…

inventor如何钣金出弧面_Inventor教程之钣金多规则

钣金多规则是继钣金多实体之后,Inventor 在钣金模块功能的又一重要增强。钣金多规则基于钣金多实体的基础上,完善了用户需要在不同实体上赋予不同板厚、展开规则、折弯释压形状、拐角释压形状以及尺寸等针对各实体的个性化设置。使用户可以把钣金多规则和…

Mybatis_接口编程

Mybatis参考使用文档:http://www.mybatis.org/mybatis-3/zh/index.html 1.项目结构 2.新增EmployeeMapper.java接口代码 package com.atguigu.mybatis.dao;import com.atguigu.mybatis.bean.Employee;public interface EmployeeMapper {public Employee getEmpById(…

计算机楼综合布线设计图,宿舍楼综合布线设计含图.doc

宿舍楼综合布线设计含图信息工程学院-网络规划与综合布线PAGE第 PAGE 10 页 共10页目 录HYPERLINK \l _Toc5475 摘要1HYPERLINK \l _Toc2717 关键词 1HYPERLINK \l _Toc30683 前言11.综合布线设计原则布 HYPERLINK \l _Toc20365 1HYPERLINK \l _Toc1695 2. 总体结构1HYPERLINK …

iconv 判断字符编码_GBK 和 UTF8编码

相关学习内容:https://study.163.com/course/courseMain.htm?courseId1210747815&share2&shareId480000002227524​study.163.com9节课征服「字符编码」 - 网易云课堂9节课征服「字符编码」 - 网易云课堂​study.163.com首先来看一下常用的编码有哪些&…

完美粉红噪声及各种声波测试软件,粉红噪声的测试原理

粉红噪声。既然是噪声就绝对不是单纯的纯音,它是一种频率覆盖范围很宽的声音。低频能下降到接近0Hz(不包括0Hz)高频端能上到二十几千赫,而且它在等比例带宽内的能量是相等的(误差只不过0.1dB左右)。比如用1/3oct带通滤波器去计算分析,我们会发…

oracle 11g jdbc jar包在哪个文件目录

一. 如果装了oracle数据库的话, 大致是这样的目录: D:\oracle\product\11.2.0\client_1\oui\jlib\classes12.jar 或者 D:\oracle\product\11.2.0\dbhome_1\oui\jlib\classes12.jar 注意: 对于oracle11的jdbc\lib下没有classer12.jar文件&#xff0…

catia怎么进入装配_CATIA教程之常见去参方法

Catia去除参数常用于以下几种情形:1)模型比较大,通过邮件发送不方便,去除模型参数可以减小模型数据大小。2)有时候需要将模型给别人使用,不希望对方知道你的建模过程或者更改你的模型,为了保密或者保护自己&#xff0c…

计算机器人夹具的方向,一种机器人夹具抓取算法的制作方法

本发明涉及机械设备领域,具体涉及一种机器人夹具抓取算法。背景技术:随着现代机械化程度的提高,在工业生产中大量使用搬运机器人对货物(以板材为例)进行拆垛码垛,机器人夹具夹取及放置物品时需根据参数设置在一定范围内完成自动目…

JAR包、WAR包及EAR包的区别

JAR包:打成JAR包的代码,一般作为工具类。在项目中,会应用到N多JAR工具包,所以jar包又称工具包; WAR包:JAVA WEB工程都是打成WAR包进行发布,如果我们的服务器选择TOMCAT等轻量级服务器&#xff0…

beeline执行sql文件_MyBatis的SQL执行流程不清楚?看完这一篇就够了

前言MyBatis可能很多人都一直在用,但是MyBatis的SQL执行流程可能并不是所有人都清楚了,那么既然进来了,通读本文你将收获如下:1、Mapper接口和映射文件是如何进行绑定的2、MyBatis中SQL语句的执行流程3、自定义MyBatis中的参数设置…

Git 下载、安装与SSH配置

一、Git学习笔记(基于Github) Git简介 Git是目前流行的分布式版本管理系统。它拥有两套版本库,本地库和远程库,在不进行合并和删除之类的操作时这两套版本库互不影响。也因此其近乎所有的操作都是本地执行,所以在断网的…