【数据结构】图的遍历

news2024/11/16 18:55:20

深度优先遍历

 深度优先遍历思想

对于图:选中一个结点,访问和其相邻的、未被访问过的点,全部访问完毕后回退到上一个结点,直至全部结点访问完毕,类似于图的先序遍历,如有邻接表,则按邻接矩阵的顺序遍历。

时间复杂度:O(|v|)

对于邻接矩阵:选中一个结点,寻找其对应列标,找到后在此行依次从左向右遍历,如为1则对其行标的元素进行访问,然后寻找此元素的列标,与上一步进行循环,遇到访问过的结点则跳过,如一个列标行所有为1的结点访问完毕,则回溯到上一层。

时间复杂度:O(|v|²)  每行v,v行v²

对于邻接表:选中一个头结点,对其表结点从左向右进行访问,访问到第一个表结点后跳转到其对应的头结点,与上一步进行循环,如遇到访问过的结点则跳过,如一个头结点的表结点全部访问完毕则跳转至上一层头结点。

时间复杂度:O(|v|+|E|)         访问头结点:O(|v|)  访问头结点的邻接结点:O(|E|)

同一个图的邻接矩阵表示唯一,因此深度优先遍历序列唯一

同一个图的邻接表表示不唯一(表结点顺序可任意),因此深度优先遍历序列不唯一


 深度优先遍历——伪代码

bool visited[MaxVertexNum] //存储访问状态的数组

void DFSTraverse(Graph G){
    int v;
    for(v=0;v<G.vexnum;++v) //遍历所有顶点
        visited[v]=FALSE; //将所有顶点初始化为未访问状态

    for(v=0;v<G.vexnum;++v) //遍历所有顶点
        if(!visited[v]) //找到第一个FALSE顶点
            DFS(G,v); //对其进行DFS遍历
}

void DFS(Graph G,int v) //递归遍历,顶点v、图G
{
    visit(v); //访问顶点v
    visited[v]=true; //将判断数组置为已访问

    for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
    if(!visited[w]){
        DFS(G,w);
    } //if
}

广度优先遍历 

 广度优先遍历思想

对于图:选中一个结点,访问和其相邻的、未被访问过的所有的顶点,每个顶点分别呈辐射状向下遍历,相当于树的层次遍历

对于邻接表:选中一个结点,寻找其对应头结点,找到后在此行的所有表结点全部入队,并按照从左到右的顺序依次将表结点元素的对应头结点进行上一步操作,直至所有元素都被访问过

时间复杂度:O(|v|+|E|)   访问头结点:O(|v|)  访问头结点的邻接结点:O(|E|)

 


  广度优先遍历——伪代码

 总体思想:入队一个结点,将其出队并让其所有邻接结点入队,依次循环,直至队列为空 

 如果需要遍历的图G不是连通图,假设G有2个连通分量,BFSTraverse函数的第二个for循环会对每个连通分量都使用BFS来保证全部遍历完成,即找到第一个未访问结点后对其进行BFS直至整个连通分量都被遍历完毕,然后寻找下一个未被访问的结点,其所在连通分量必定都未被访问

bool visited[MaxVertexNum] //存储访问状态的数组

void BFSTraverse(Graph G){
    int i;
    for(i=0;i<G.vexnum;++i) //遍历所有顶点
        visited[i]=FALSE; //将所有顶点初始化为未访问状态
    InitQueue(Q); //初始化一个队列

    for(i=0;i<G.vexnum;++i) //遍历所有顶点、连通分量
        if(!visited[i]) //找到第一个顶点
            BFS(G,i); //对其进行BFS遍历,对每一个顶点都进行BFS
}

void BFS(Graph G,int v){//从顶点v出发

    visit(v);//访问顶点v
    visited[v]=TRUE;//将其置为已经访问
    Enqueue(Q,v);//将v入队

    while(!isEmpty(Q)){ //当队列为空停止循环
        DeQue(Q,v); //将v出队
        for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))//依次寻找v的所有邻接顶点w,每找到一个就循环一次
        if(!visited[w]){ //如果顶点w未被访问过
            visit(w); //访问顶点w
            visited[w]=TRUE; //将顶点w置为已访问
            EnQueue(Q,w); //将顶点w入队
        }//if
    }//while
}

 时间复杂度分析:

对于递归工作栈:O(|v|)

共有v个顶点

对于邻接矩阵:O(|v|²) 

共有v行v列,全部遍历为v²,查找每个邻接点为O(|v|),总共有v个顶点

对于邻接表:O(|v|+|E|)   

访问头结点:O(|v|) ,访问头结点的邻接结点:O(|2E|)

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

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

相关文章

一文熟悉 Go 的基础语法和基本数据类型

一文熟悉 Go 的基础语法和基本数据类型前言Hello&#xff0c;World&#xff01;有关 main 函数的一些要点关键字package声明引入基本数据类型整形数据类型有符号整数类型无符号整数类型其他整数类型浮点数据类型字符类型布尔类型字符串类型基本数据类型的默认值常量和变量声明结…

swift指针内存管理-指针类型使用

为什么说指针不安全 我们在创建一个对象的时候&#xff0c;是需要在堆上开辟内存空间的 但是这个内存空间的声明周期是有限的 也就意味着如果使用指针指向这块内存空间&#xff0c;当这块内存空间的生命周期结束&#xff08;引用计数为0&#xff09;&#xff0c;那么当前的指针…

mac m1 配置goland debbug

大概率无法使用goland的debug功能&#xff0c;如果自己安装没选对路径&#xff0c;也无法使用。原因是&#xff1a; go env 配置不对&#xff0c;需要指向 ARM64&#xff1b; dlv版本不对&#xff0c;需要使用 arm64 系列&#xff1b; dlv路径不对&#xff0c;需要使用 macarm…

Linux服务器使用git clone命令时报错的解决方案

在往GitHub上上传项目时&#xff0c;使用git clone xxxxx.git时候报错&#xff1a; “gnutls_handshake() failed: the TLS connection was non-properly terminated” 由系统的 git 默认使用的 libcurl4-gnutls-dev 造成&#xff0c;可以使用openssl解决. 但是这个过程也很多…

2022亚太B题赛题分享

高速列车的优化设计 2022年4月12日&#xff0c;中国高铁复兴CR450多机组成功实现单列列车速度435 km/h&#xff0c;相对速度870 km/h&#xff0c;创造了高铁多机组列车穿越明线和隧道速度的世界纪录。新一代标准动车组“复兴”是中国自主研发的具有全知识产权的新一代高速列车。…

Doris 5 处理Sentinel-1 生成干涉图 interferogram

Doris 5 处理Sentinel-1 Step 0 创建文件夹 首先创建一个文件夹用来准备数据处理&#xff0c;例如 “Doris_test1”&#xff0c;然后在该文件夹下创建五个文件夹&#xff0c;用来存放数据&#xff0c;例如 AOI (研究区的shp文件), archive_data (已下载的Sentinel-1 SLC文件&…

手部IK,自制动画,蒙太奇——开门手臂自动弯曲、靠墙手自动扶墙

开门手臂自动弯曲 实现效果&#xff1a;人物做出抬手的开门动画时&#xff0c;若手臂碰到静态网格物体&#xff0c;拳头不会穿过物体&#xff0c;而是会产生手臂IK弯曲动画效果。 重要参考资料&#xff1a; 学习UE4动画蓝图&#xff1a;配置手部IK_YakSue的博客-CSDN博客_ue…

ImageProvider工作流程和AssetImage 加载流程

Flutter 学习&#xff1a;ImageProvider工作流程和AssetImage 的自动分辨率适配原理https://cloud.tencent.com/developer/article/1748045上面流程为ImageProvider工作流程细节&#xff0c;作者已经写的很详细了&#xff0c;非常受用&#xff0c;现在接着上面作者内容讨论下As…

【32-业务开发-基础业务-规格参数-保存数据-查询数据-更新操作之数据回显展示-更新操作-前后端项目交互整合与测试-总结收获】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

1532_AURIX_TriCore内核架构_中断

全部学习汇总&#xff1a; GreyZhang/g_tricore_architecture: some learning note about tricore architecture. (github.com) 中断一直是我想了解关注的一个功能模块&#xff0c;因为感觉不同的芯片上这部分的设计差异比较大。而这部分也跟我们嵌入式软件的设计模式直接相关。…

使用HikariCP连接池常用配置讲解及注意事项

使用HikariCP连接池常用配置讲解及注意事项常遇到的几种错误Possibly consider using a shorter maxLifetime valueConnection is not available, request timed out after xxxxxmsNo operations allowed after connection closed常见配置及注释说明&#xff0c;可以使用并根据…

每日刷题2——指针概念

更新不易&#xff0c;麻烦多多点赞&#xff0c;欢迎你的提问&#xff0c;感谢你的转发&#xff0c; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我…

Twins: Revisiting the Design of Spatial Attention in Vision Transformers

Twins: Revisiting the Design of Spatial Attention in Vision Transformers一、引言二、Twins-PCPVT三、Twins-SVT四、实验五、消融实验文章链接: https://arxiv.org/abs/2104.13840代码链接: https://github.com/Meituan-AutoML/Twins一、引言 在本文中&#xff0c;重新审…

基于Matlab计算经典CFAR阈值

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

基于开源 PolarDB-X 打造中正智能身份认证业务数据基座

一、公司及业务介绍 中正智能是全球领先的生物识别和身份认证公司之一。我们曾负责公安部指纹算法国家标准的起草、编写&#xff0c;具备从算法、终端、平台、设计、生产、交付全域自研的能力&#xff0c;拥有多项自主知识产权的产品&#xff0c;并积极与高校合作开展基础研发。…

【Rust 指南】并发编程|无畏并发的原因

文章目录前言1、线程1.1、通过 spawn 创建新线程1.2、join 方法2、move 强制所有权迁移3、使用消息传递跨线程传递数据3.1、Send 方法3.2 、Sync 方法前言 安全高效的处理并发是 Rust 诞生的目的之一&#xff0c;主要解决的是服务器高负载承受能力。 并发&#xff08;concurren…

石家庄正定县恢复种植 国稻种芯·中国水稻节:河北绘就画卷

石家庄正定县恢复种植 国稻种芯中国水稻节&#xff1a;河北绘就画卷 新华社记者 杨世尧 摄 河北日报 通讯员张 晓峰 摄影报道 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健康大会…

MongoDB备份与恢复

MongoDB备份与恢复 文章目录MongoDB备份与恢复1.备份恢复工具2.备份工具区别3.mongoexport导出工具命令4.导出MongoDB的表4.1.创建备份的目录4.2.登录数据库4.3.查询表和表中数据4.4.导出数据为json格式4.5.导出数据为csv格式5.mongoimport导入工具5.1.恢复json格式数据5.2.登录…

Python基础-3-列表

一&#xff1a;简述 列表是由一系列按特定顺序排列的元素组成&#xff0c;可以创建包含字母表中所有字母&#xff0c;数字或家庭成员姓名的列表&#xff1b;也可以将任何东西加入列表&#xff0c;其中的元素之间可以没有任何关系。列表中通常包含了多个元素&#xff0c;因此给…

HTTPS中间人攻击实验

HTTPS中间人攻击实验 一.实验基础 1、HTTPS概述 HTTPS (全称: Hyper Text Transfer Protocol over SecureSocketLayer)&#xff0c; 是以安全为目标的HTTP通道&#xff0c;在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。 默认端口&#xff1a;443 SSLspli…