DSA之图(3):图的遍历

news2024/7/6 20:34:03

文章目录

  • 0 图的遍历
  • 1 图的遍历方法
    • 1.1 深度优先搜索DFS
      • 1.1.1 DFS的思想
      • 1.1.2 邻接矩阵DFS的实现
      • 1.1.3 邻接矩阵DFS的代码实现
      • 1.1.4 非连通图的DFS遍历
      • 1.1.5 DFS算法效率分析
    • 1.2 广度优先搜索BFS
      • 1.2.1 BFS的思想(连通图)
      • 1.2.2 BFS的思想(非连通图)
      • 1.2.3 邻接表BFS的实现
      • 1.2.4 邻接表BFS的代码实现
      • 1.2.5 BFS算法效率分析
  • 2 DFS与BFS算法效率比较

0 图的遍历

在这里插入图片描述
实际上就是找出每个顶点的邻接点的过程。
在这里插入图片描述

1 图的遍历方法

图常用的遍历有两种方法:

  1. 深度优先搜索DFS
  2. 广度优先搜索BFS

1.1 深度优先搜索DFS

在这里插入图片描述
基本思路就是,一条路走到黑,走到无路可走就往回退,再检查是否有未走过的路(邻接点)。
(发现有邻接点未访问就去访问,直到所有邻接点都被访问)
在这里插入图片描述

1.1.1 DFS的思想

在这里插入图片描述
记住,往回退的时候只能走来的时候的路(原路返回)。

在这里插入图片描述
DFS很像树的先序遍历。

1.1.2 邻接矩阵DFS的实现

在这里插入图片描述

每个顶点只能访问一次,设置一个辅助数组Visted[i],开始的时候将数组初始化为0,所有顶点一开始都没访问过,访问过就设置1。
在这里插入图片描述
基本流程

假设,起点从 v 2 v_2 v2开始,并将其在辅助数组中的值改为1,接下来看 v 2 v_2 v2的没有被访问过的邻接点。怎么去找呢?查看邻接矩阵,行下标为2的,顺序去找。现在 v 2 v_2 v2的一个邻接点为 v 1 v_1 v1,正好 v 1 v_1 v1没有访问过(因为visited[1]=0),所以就可以往 v 1 v_1 v1那里走。到了 v 1 v_1 v1后,开始找 v 1 v_1 v1未访问的邻接点,按顺序来,首先找到了 v 2 v_2 v2,但是 v 2 v_2 v2此时被访问过了,不能访问,所以接着寻找,找到了 v 3 v_3 v3,没被访问过,就可以访问。到了几号,就要从几号出发,进行DFS。过了 v 3 v_3 v3找到了 v 5 v_5 v5没有访问,即走到了 v 5 v_5 v5。到了 v 5 v_5 v5发现 v 2 v_2 v2 v 3 v_3 v3都访问过了,所以进行回退,此时 v 5 v_5 v5是由 v 3 v_3 v3访问过来的,所以先回退到 v 3 v_3 v3,从哪来的就往哪里退,再接着从 v 3 v_3 v3访问,此时,与 v 3 v_3 v3相关的都被访问了,所以继续回退,回退到 v 1 v_1 v1继续进行DFS,发现 v 4 v_4 v4还没被访问,进行访问同时数组置1。到了 v 4 v_4 v4发现 v 6 v_6 v6还没被访问,所以进行访问。到了 v 6 v_6 v6发现邻接点都被访问了,所以往回退到 v 4 v_4 v4 v 4 v_4 v4往回退为 v 1 v_1 v1,还是都访问过,再回退到 v 2 v_2 v2,发现还是都访问过了,再发现visited[i]数组全是1,都访问过了,DFS结束。
在这里插入图片描述

1.1.3 邻接矩阵DFS的代码实现

void DFS(AMGraph G, int v) //图G为邻接矩阵类型
{
    cout << v;
    visited[v] = true; //访问第v个顶点
    for (w = 0; w < G.vexnum; ++w) //依次检查邻接矩阵v所在的行
    {
        if((G.arcs[v][w]!=0) && (!visited[w]))
        {
            DFS(G, w);
            //w是v的邻接点,如果w未访问,则递归调用DFS
        }
    }
}

1.1.4 非连通图的DFS遍历

在这里插入图片描述
从任意一个顶点开始,找其未被访问的邻接点进行访问。当连通图的顶点都访问完后,再在其他的未被访问的顶点当中选一个点进行访问,进行DFS。

1.1.5 DFS算法效率分析

在这里插入图片描述

1.2 广度优先搜索BFS

在这里插入图片描述

1.2.1 BFS的思想(连通图)

首先从一个点开始(假设就是入口的那个点),访问其所有的邻接点,如下所示:
在这里插入图片描述
都点亮之后,再扩大一层,即找邻接点的邻接点,直到所有点都被访问。
在这里插入图片描述
在这里插入图片描述

1.2.2 BFS的思想(非连通图)

在这里插入图片描述
也是从一个顶点出发,访问其邻接点,之后再找邻接点的邻接点。接下来找非连通的部分,未访问的顶点中任取一个来访问。
在这里插入图片描述

1.2.3 邻接表BFS的实现

在这里插入图片描述

需要一个visited[i]数组来表示点是否被访问。
其实现过程,访问顺序与树的层次遍历有点像。在树的层次遍历当中,是用队列来实现的,加入节点,加入其孩子,加入其孩子的孩子,以此类推;而邻接表当中是加入节点,加入其邻接点,加入其邻接点的邻接点,以此类推。

实现过程
0号位置即 v 1 v_1 v1入队,在队尾,队尾指针移动一下,visited[0]相应的置1,代表被访问过,之后队列中的0号出队,找其邻接点并入队。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如何找 v 1 v_1 v1的邻接点?在邻接表中进行寻找,第一个单链表就是。发现了1号位置的 v 2 v_2 v2和2号位置的 v 3 v_3 v3,被访问了,数组相应位数置1,且入队。在这里插入图片描述
被访问后就出队,出队到 v 2 v_2 v2,找其邻接点3号也就是 v 4 v_4 v4,进行入队置1,接下来又找到了4号也就是 v 5 v_5 v5,进行入队置1。
在这里插入图片描述
在这里插入图片描述
现在 v 2 v_2 v2顶点的两个邻接点都入队了。接下来就下一个,2号 v 3 v_3 v3为队头,出队,开始找其邻接点。找到了5号6号,即 v 6 v_6 v6 v 7 v_7 v7
在这里插入图片描述
之后再看3号即 v 4 v_4 v4的邻接点,为7号 v 8 v_8 v8,加入进来。在这里插入图片描述
之后访问4号 v 5 v_5 v5的邻接点。将 v 5 v_5 v5的两个邻接点入队,但是1号和7号都入队了,所以忽略。
所以接着访问5号 v 6 v_6 v6发现其邻接点都访问过了。之后看6号的邻接点,也是都访问过了,之后看7号的邻接点,都访问过了。BFS结束。

1.2.4 邻接表BFS的代码实现

void BFS(Graph G, int v)//广度优先搜索
{
    cout << v;
    visited[v] = true; //访问第v个顶点
    InitQueue(Q, v); //辅助队列Q初始化,置空
    EnQueue(Q, v);//V进队
    while(!QueueEmpty(Q))//队列非空
    {
        DeQueue(Q, u); //队头元素出队并置为u
        for (w = FirstAdjVex(G, u); w >= 0; w = NextAdjVex(G, u, w))
        if(!visited[w]) //w为u的尚未访问的邻接顶点
        {
            cout << w;
            visited[w] = true;
            EnQueue(Q, w); //w进队
        }
    }
}

1.2.5 BFS算法效率分析

在这里插入图片描述

2 DFS与BFS算法效率比较

空间复杂度

  • 空间复杂度相同,都是 O ( n ) O(n) O(n)(借用了堆栈或队列)

时间复杂度

  • 时间复杂度只与存储结构(邻接矩阵或邻接表)有关,而与搜索路径无关。邻接矩阵为 O ( n 2 ) O(n^2) O(n2),邻接表为 O ( n + e ) O(n+e) O(n+e)

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

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

相关文章

【机器学习】分类算法 - 模型选择与调优GridSearchCV(网格搜索)

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;零基础快速入门人工智能《机器学习入门到精通》 模型选择与调优 1、交叉验证2、网格搜索3、模型选择与调优API4、案…

IntelliJ IDEA 2023.2 最新变化

主要更新 AI Assistant 限定访问 Ultimate 在此版本中&#xff0c;我们为 IntelliJ IDEA 引入了一项重要补充 – AI Assistant。 AI Assistant 当前具备一组由 AI 提供支持的初始功能&#xff0c;提供集成式 AI 聊天&#xff0c;可以完成一些任务&#xff0c;例如自动编写文档…

在win10上安装spinal hdl完全教程(一篇文章就够了)

一 参考文章 SpinalHDL 开发环境搭建一步到位(图文版) - 极术社区 - 连接开发者与智能计算生态 (aijishu.com)https://aijishu.com/a/1060000000255643SpinalHDL(一)——环境搭建 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/146529005

Android安卓实战项目(4)---提供给阿尔兹海默症患者的APP(源码在文末)

Android安卓实战项目&#xff08;4&#xff09;—提供给阿尔兹海默症患者的APP&#xff08;源码在文末&#xff09; 一.项目运行介绍 1.大致浏览 &#xff08;1&#xff09;开机界面 &#xff08;2&#xff09;主界面 &#xff08;3&#xff09;Read Instructions界面 &…

运维:Windows11操作系统安装VMware16.1.1图文教程(附下载)

目录 一、VMware 16.1.1 介绍 二、安装教程 三、下载地址 一、VMware 16.1.1 介绍 VMware 16.1.1 是一款功能非常强大虚拟化软件&#xff0c;它允许用户在一台计算机上创建和运行多个虚拟机&#xff08;Virtual Machine&#xff09;相当于拥有多台服务器。这些虚拟机可以模拟…

JUC高并发编程(二)——Synchronized关键字

文章目录 前言为什么要用Synchronized关键字 并发编程中的三个问题可见性原子性有序性 Synchronized保证三大特性使用synchronized保证可见性使用synchronized保证原子性用synchronized保证有序性 Synchronized的特征可重入特征不可中断特征 前言 synchronized 关键字&#xff…

Python爬虫时遇到SSL证书验证错误解决办法汇总

在进行Python爬虫任务时&#xff0c;遇到SSL证书验证错误是常见的问题之一。SSL证书验证是为了确保与服务器建立的连接是安全和可信的&#xff0c;但有时候可能会由于证书过期、不匹配或未受信任等原因导致验证失败。为了解决这个问题&#xff0c;本文将提供一些实用的解决办法…

提高业务效率:利用手机号在网状态 API 进行智能筛选

引言 随着科技的不断发展&#xff0c;手机已成为现代人生活中不可或缺的工具。人们通过手机完成通信、娱乐、购物等各种活动&#xff0c;使得手机号成为了一个重要的个人标识。对于企业而言&#xff0c;了解手机号的在网状态对于业务发展和客户管理至关重要。为了提高业务效率…

https和http有什么区别

https和http有什么区别 简要 区别如下&#xff1a; ​ https的端口是443.而http的端口是80&#xff0c;且二者连接方式不同&#xff1b;http传输时明文&#xff0c;而https是用ssl进行加密的&#xff0c;https的安全性更高&#xff1b;https是需要申请证书的&#xff0c;而h…

Linux常用命令——dpkg-statoverride命令

在线Linux命令查询工具 dpkg-statoverride Debian Linux中覆盖文件的所有权和模式 补充说明 dpkg-statoverride命令用于Debian Linux中覆盖文件的所有权和模式&#xff0c;让dpkg于包安装时使得文件所有权与模式失效。 语法 dpkg-statoverride(选项)选项 -add&#xff1…

深度:解密数据库的诗与远方!

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 不同于历史上的黄金和石油&#xff0c;数据成为了我们新的宝藏&#xff0c;一个驱动社会进步、催生创新的无尽源泉。然而&#xff0c;这些形式各异、复杂纷繁的数据需要一个管理者&#xff0c;一个保险库&#xff0c;一个解…

【动态规划part09】| 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

&#x1f388;LeetCode198.打家劫舍 链接&#xff1a;198.打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷…

【数据结构】实验三:链表

实验三链表 一、实验目的与要求 1&#xff09;熟悉链表的类型定义&#xff1b; 2&#xff09;熟悉链表的基本操作&#xff1b; 3&#xff09;灵活应用链表解决具体应用问题。 二、实验内容 1&#xff09;请设计一个单链表的存储结构&#xff0c;并实现单链表中基本运算算…

基于ssm+mysql+jsp高校疫情防控出入信息管理系统

基于ssmmysqljsp高校疫情防控出入信息管理系统 一、系统介绍二、功能展示1.登陆2.教师管理3.学生管理4.打卡记录管理5.学生申请通行证6.通行证管理7.留言信息管理8.公告类型管理9.公告管理 四、获取源码 一、系统介绍 学生 : 个人中心、打卡记录管理、学生申请通行证、通行证管…

Java 8 Stream流:代码简洁之道

文章目录 前言一、filter二、map三、mapToInt、mapToLong、mapToDouble四、flatMap五、flatMapToInt、flatMapToLong、flatMapToDouble六、distinct七、sorted八、peek九、limit十、forEach十一、forEachOrdered十二、toArray十三、reduce十四、collect十五、min、max十六、cou…

mysql(二) 索引-基础知识

继续整理复习、我以我的理解和认知来整理 "索引" 会通过 文 和 图 来展示。 文&#xff1a; 基本概念知识&#xff08;mysql 的索引分类、实现原理&#xff09; 图&#xff1a; 画B树等 MySQL官方对索引的定义是&#xff1a;索引&#xff08;Index&#xff09;是帮…

记录--虚拟 DOM 和实际 DOM 有何不同?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 本文我们会先聊聊 DOM 的一些缺陷&#xff0c;然后在此基础上介绍虚拟 DOM 是如何解决这些缺陷的&#xff0c;最后再站在双缓存和 MVC 的视角来聊聊虚拟 DOM。理解了这些会让你对目前的前端框架有…

第四章 HL7 架构和可用工具 - 查看数据结构

文章目录 第四章 HL7 架构和可用工具 - 查看数据结构查看数据结构查看代码表使用自定义架构编辑器 第四章 HL7 架构和可用工具 - 查看数据结构 查看数据结构 当单击“数据结构”列中的名称时&#xff0c;InterSystems 会显示该数据结构中的所有字段。这是 HL7 数据结构页面。…

影视行业案例 | 燕千云助力大地影院集团搭建智能一体化IT服务管理平台

影视行业过去三年受新冠肺炎疫情影响&#xff0c;经历了一定程度的冲击和调整&#xff0c;但也展现出了强大的韧性和潜力。2023年中国影视产业规模可能达到2600亿元左右&#xff0c;同比增长11%左右。影视行业的发展趋势主要表现在内容创新、模式创新和产业融合三个方面&#x…

第八章:将自下而上、自上而下和平滑性线索结合起来进行弱监督图像分割

0.摘要 本文解决了弱监督语义图像分割的问题。我们的目标是在仅给出与训练图像关联的图像级别对象标签的情况下&#xff0c;为新图像中的每个像素标记类别。我们的问题陈述与常见的语义分割有所不同&#xff0c;常规的语义分割假设在训练中可用像素级注释。我们提出了一种新颖的…