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,一经查实,立即删除!

相关文章

通用测试用例大全

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

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

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

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(…

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带通滤波器去计算分析,我们会发…

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

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

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

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

Git 下载、安装与SSH配置

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

windows7未能启动怎么修复计算机,win7系统提示windows无法启动这个硬件设备怎么办...

‍‍最近有很多深度技术win7用户在打开视频、光驱很有usb的时候,电脑出现了“图像处理设备由于其配置信息不完整或已损坏Windows 无法启动这个硬件设备(代码19)”的提示,这该怎么办呢?对于设备管理器中设备不正常的问题,下面由小编…

将视图转为image_使用视图绑定替代 findViewById

从 Android Studio 3.6 开始,视图绑定能够通过生成绑定对象来替代 findViewById,从而可以帮您简化代码、移除 bug,并且从 findViewById 的模版代码中解脱出来。本文梗概在 build.gradle 中就可以方便快捷地开启视图绑定且无须额外引入依赖库视…

第二专业 计算机考试成绩查询系统,2021年上半年信息系统项目管理师成绩查询时间公布(7月12日),查询入口已开通!...

2021年上半年信息系统项目管理师成绩查询时间公布!2021年7月12日上午11点3分48秒,软考办官网发布了2021年上半年计算机技术与软件专业技术资格(水平)考试成绩查询通知。2021年上半年信息系统项目管理师成绩查询入口开通!赶快来查成绩吧!2021年上半年信息系统项目管理…

本周数据与上周对比应如何表达_互联网运营中的数据分析方法

在大数据分析和产品、运营优化方面,大数据分析方法是其核心,那么如何做好数据分析呢,今天我们来讲讲互联网运营中的数据分析方法。1.细分分析细分分析是分析的基础,单一维度下的指标数据的信息价值很低。细分方法可以分为两类&…

惠斯通电桥信号调理芯片_elmos推出专为汽车应用开发的传感器信号调理芯片E520.47...

——符合标准ISO26262 ,达到ASIL C等级2019年3月,德国巴伐利亚州慕尼黑讯,elmos日前宣布推出E520.47,这是一款带有SENT接口的传感器信号调理IC,支持两路电阻式传感器电桥的同步信号处理。该IC专为汽车应用的需求而开发…

lab 2 EIGRP Default Route

EIGRP发布默认路由的四种方式Redistributed default route #R1# router eigrp 100redistribute static network 10.1.1.1 0.0.0.0no auto-summary ip route 0.0.0.0 0.0.0.0 202.100.1.10By using ip summary-address command #interface FastEthernet1/0ip address 10.1.1.1 2…

今天英雄联盟服务器维护要到好久,lol今天维护时间是多久 lol维护公告2020最新...

英雄联盟今天维护到几点?今日维护时间是多久?lol维护公告2020最新消息来啦!英雄联盟在4月16日凌晨1点进行了游戏的停机更新。下面,就和小编一起来了解一下最新的维护内容吧!lol10.8版本维护到几点LOL将在4月16日凌晨1点关闭排位赛入口(不影响已经在进行中的对局)&…

开关怎么使用_水龙头漏水怎么办?使用时把控开关力度很重要

水龙头漏水是家居生活中器件中常见的故障之一,导致水龙头漏水的原因有很多,严重就需要我们更换新的水龙头了。水龙头漏水怎么办呢?其实,我们掌握一些家居生活的知识也是对我们很有帮助的,下面是水龙头漏水的解决办法以及预防措施…

fast路由器服务器未响应,win7系统下fast路由器进不了设置界面如何解决

最近有不少win7纯净版系统用户到本站反馈说碰到这样一个问题,就是在使用fast路由器的时候,进不了设置界面,导致无法进行一系列设置,该怎么办呢,接下来给大家讲解一下win7系统下fast路由器进不了设置界面的具体解决方法…

xshell堡垒机_Jumpserver开源堡垒机管理

此篇文章主要介绍jumpserver开源堡垒机管理,安装请移至:Jumpserver开源堡垒机安装一、用户管理1)添加用户1输入要添加的用户名,姓名,权限,Mail,并且发送邮件 —> 确认保存23查看添加的用户4查看用户邮件…

vnc连接服务器怎么配置文件,vnc服务器和客户端怎么配置文件

vnc服务器和客户端怎么配置文件 内容精选换一换用户通过psycopy2连接GaussDB(for openGauss)服务器时,可以通过开启SSL加密客户端和服务器之间的通讯。在使用SSL时,默认用户已经获取了服务端和客户端所需要的证书和私钥文件,关于证书等文件的…

Linux学习(一)

从零开始学习linux,这里不多写虚拟机的安装以及centos的设置,简单粗暴从命令行开始; 一、目录介绍 /bin  存放必要的命令 /boot  存放内核以及启动所需的文件 /dev  存放设备文件 /etc  存放系统配置文件 /home  普通用户的宿主目录…