数据结构【图的遍历】

数据结构之图

  • 图的类型定义和存储结构
  • 图的遍历
    • 遍历的定义
    • 图的特点
    • 图常用的遍历
      • 深度优先搜索 DFS(DepthFirstSearch)
        • 算法实现
        • 算法效率分析
      • 广度优先搜索 BFS(BreadthFirstSearch)
        • 算法实现
        • 算法效率分析
      • DFS与BFS算法效率比较

图的类型定义和存储结构

图的遍历

遍历的定义

从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。
在这里插入图片描述

图的特点

图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。
那么怎样避免重复访问?
解决思路:设置辅助数组visitel[n],用来标记每个被访问过的顶点。
初始状态visited [i]为0,顶点i 被访问,改 visited [i]为1,防止被多次访问。

图常用的遍历

在这里插入图片描述

深度优先搜索 DFS(DepthFirstSearch)

方法:

  • 在访问图中某一起始顶点 v后,由 v出发,访问它的任一邻接顶点 w1;
  • 再从 w1 出发,访问与w1接但还未被访问过的顶点 w2;
  • 然后再从w2出发,进行类似的访问,如此进行下去,直至到达所有的邻接顶点都被访问过的顶点u为止;
  • 接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。
  • 如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;
  • 如果没有,就再退回一步进行搜索。
  • 重复上述过程,直到连通图中所有顶点都被访问过为止。

在这里插入图片描述

算法实现

采用邻接矩阵表示图的深度优先搜索遍历

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
算法效率分析

用邻接矩阵表示图,遍历图中的每一个顶点都要从头部扫描该顶点所在行,时间复杂度为O(n2)。

广度优先搜索 BFS(BreadthFirstSearch)

方法:
从图的某一节点出发,首先依次访问该节点的多有邻接节点Vi1,V2i,…再按照这些顶点被访问的先后次序,依次访问与他们相连接的所有被访问的顶点;
重复此过程,直到所有顶点均被访问为止。

算法实现
void BFS (Graph G, int v){//按广度优先非递归遍历连通图Gcout< <v; visited[v] = true;//访问第v个顶点InitQueue(Q);//辅助队列Q初始化,置空EnQueue(Q v);//v进队while(!QueueEmpty(Q)){//队列非空DeQueue(Q, u);//队头元素出队并置为ufor(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进队3}}		
}//BFS
算法效率分析

如果使用邻接矩阵,则BFS对于每一个被访问到的顶点,都要循环检测矩阵的整整一行(n个元素),总的时间代价为O(n2)。
用邻接矩阵来表示图,虽然有2e个表节点,但是只需要扫描e个节点即可完成遍历,加上访问n个头节点的时间,时间复杂度为O(n+e)。

DFS与BFS算法效率比较

空间复杂度相同,都是O(n)(借用了堆栈或者队列)。
时间复杂度只与存储结构有关(邻接矩阵或者邻接表),而与搜索路径无关。

参考资料:数据结构与算法基础-王卓老师

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

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

相关文章

第八篇【传奇开心果短博文系列】Python的OpenCV技术点案例示例:深度学习

传奇开心果短博文系列 系列短博文目录Python的OpenCV技术点案例示例系列 短博文目录一、前言二、OpenCV深度学习介绍三、OpenCV常用深度学习算法和实现分别示例代码四、归纳总结 系列短博文目录 Python的OpenCV技术点案例示例系列 短博文目录 一、前言 OpenCV深度学习&…

【UVM源码】UVM Config_db机制使用总结与源码解析

UVM Config_db机制使用总结与源码解析 UVM Config_db机制介绍UVM Config_db 机制引入的背景基本介绍使用方法优缺点&#xff1a; UVM Config_db机制使用示例&#xff1a;UVM Config_db使用高阶规则Config_db资源优先级 UVM Config_db 源码解析 UVM Config_db机制介绍 UVM Conf…

idea引入ojdbc包报错

网上下载或者让同事传两个jar过来&#xff0c;ojdbc6-11.2.0.7.0.jar 以及jconn3.0.jar 放入同一个文件夹中&#xff1a; 在此文件夹中cmd如下&#xff1a;回车&#xff0c;进入cmd控制台。 输入如下两个命令&#xff1a; mvn install:install-file -DgroupIdcom.oracle -Dar…

【网络】:网络套接字

网络套接字 一.网络字节序二.端口号三.socket1.常见的API2.封装UdpSocket 网络通信的本质就是进程间通信。 一.网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大…

可曾听闻Nginx?

目录 一.简介 二.Nginx的优点 三.反向代理 四.负载均衡 五.动静分离 六.总结 说起Nginx&#xff0c;耳边好像经常听到&#xff0c;但是不知道用来干嘛的。最近用到了&#xff0c;所以我就大概总结了基本知识&#xff0c;它经常与一个词出现在一起——反向代理。那接下来…

配置华为交换机环路检测案例

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom 思科认证\CCNA\CCNP\CCIE Linux\RHCE…

YOLOv5可视化热力图 | 支持自定义模型、置信度选择等功能(论文必备)

一、本文介绍 本文给大家带来的机制是的可视化热力图功能,热力图作为我们论文当中的必备一环,可以展示出我们呈现机制的有效性,本文的内容支持YOLOv5最新版本,同时支持视频讲解,本文的内容是根据检测头的输出内容,然后来绘图。 在开始之前给大家推荐一下我的专栏,本专…

Vue服务器端渲染(SSR)是不是技术的倒退?

一、什么是服务器端渲染&#xff0c;是不是技术退步&#xff1f; Vue服务器端渲染&#xff08;Vue Server-Side Rendering&#xff0c;简称SSR&#xff09;是一种将Vue组件在服务器端进行渲染&#xff0c;生成最终的HTML页面&#xff0c;然后将其发送给客户端的技术。 传统的V…

烧录软件(Renesas Flash Programmer)瑞萨RL78G12系列单片机下载工具(E2)的软件配置与硬件链接说明

一、单片机与仿真器连接 E1引脚接线图 RL78系列单片机的GND接仿真器的pin2、pin12、pin14 RL78系列单片机的VDD接仿真器的pin8 RL78系列单片机的Tool0接仿真器的pin5 RL78系列单片机的Reset接仿真器的pin10、pin13 二、确认接线完成后&#xff0c;开始烧录 1、打开RFPV软件…

C 练习实例50-使用Dev-C++创建项目(圆形体体积计算器)

项目展示 项目案例&#xff1a;圆形体体积计算器 vol.h文件 #include <stdio.h> #include <math.h> #define PI 3.141592654 void cal(int sel); //函数声明 double vol_ball(void); double vol_cylind(void); double vol_cone(void); main.c文件 #include &quo…

【数字通信】数字带通传输

数字调制和数字带通传输系统 数字调制解调 数字调制 用数字基带信号控制载波&#xff0c;把数字基带信号变换为数字带通信号的过程 目的&#xff1a;数字基带信号含大量低频分量&#xff0c;无法通过具有带通特性的信道传输。需对数字基带信号进行数字调制使信号与信道的特…

网际协议 IP、IP地址

目录 网际协议 IP 虚拟互连网络 使用中间设备进行互连 IP 地址 IP 地址及其表示方法 ​编辑 IP 地址采用 2 级结构 IP 地址的编址方法 分类的 IP 地址 各类 IP 地址的指派范围 一般不使用的特殊的 IP 地址 IPv4网络中的地址类型 分类的 IP 地址的优点和缺点 划分子网…

数字媒体技术基础之:声波及其测量

声音始于空气中的振动&#xff0c;如吉他弦、人的声带或扬声器纸盆产生的振动。 这些振动一起推动邻近的空气分子&#xff0c;从而轻微增加空气压力。 压力下的空气分子随后推动周围的空气分子&#xff0c;后者又推动下一组分子&#xff0c;依此类推。 高压区域穿过空气时&…

链表中倒数第k个结点

题目描述 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 这道题首先按照普通的方法用一个栈来存放链表数据然后在取出第k的数就可以了,但是这种方法的时间复杂度是O(n),不提倡; 现在我介绍一种时间复杂度为O(n-k)的方法,老规矩-->先贴源码,在分析: /*public clas…

SpringSecurity笔记

SpringSecurity 本笔记来自三更草堂&#xff1a;https://www.bilibili.com/video/BV1mm4y1X7Hc/?spm_id_from333.337.search-card.all.click&#xff0c;仅供个人学习使用 简介 Spring Security是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;…

Leetcode刷题笔记题解(C++):1117. H2O 生成(多线程)

思路&#xff1a; 解法二&#xff1a;生产者-消费者解法 1.把 hydrogen 线程看作生产者&#xff0c;oxygen 线程看作消费者&#xff0c;缓冲队列大小为2。 2.hydrogen 把生成的氢放入队列&#xff1b;oxygen 线程每次从队列里消费两个氢元素。 3.生产者生产两个氢元素后会因为…

【极数系列】Linux环境搭建Flink1.18版本 (03)

文章目录 引言01 Linux部署JDK11版本1.下载Linux版本的JDK112.创建目录3.上传并解压4.配置环境变量5.刷新环境变量6.检查jdk安装是否成功 02 Linux部署Flink1.18.0版本1.下载Flink1.18.0版本包2.上传压缩包到服务器3.修改flink-config.yaml配置4.启动服务5.浏览器访问6.停止服务…

二叉树--199. 二叉树的右视图/medium 理解度C

199. 二叉树的右视图 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出…

贪吃蛇项目(基于C语言和数据结构中的链表)

建立文件 首先先建立3个文件。 Snake.h 函数的声明 Snake.c 函数的定义 Test.c 贪吃蛇的测试 分析项目 我们分析这整个项目 建立节点 首先在我们实现游戏开始的部分之前&#xff0c;我们要先创建贪吃蛇的节点&#xff0c;再由此创建整个贪吃蛇所包含的一些信息&#…

基于对比学习的信息抽取

Label Refinement via Contrastive Learning for Distantly-Supervised Named Entity Recognition NAACL 2022&#xff1b;做的远程监督NER&#xff0c;通过知识库构建 伪标签&#xff0c;通过对比学习构建负样本&#xff0c;负样本是entity的多余部分或其他不相关部分。即对e…