典型数据结构-图,图的存储、基本操作和遍历

引自:《数据结构教程》。

概念

图可以使得元素之间的关系是 多对多。图中任意两个数据元素之间都可能存在连接关系。图作为一种数据结构,可以表达数据元素之间广泛存在着的更为复杂的关系。在众多应用之中,如电子线路分析、工程计划分析、寻找最短路径等等,图是描述这类关系的一个十分自然的模型。有关图论的内容是离散数学的主要内容之一,这里仅仅介绍一些概念和存储方法。

  1. 有向图/无向图:若图中每一条边都是没有方向的,则为无向图。如图中每一条边都具有方向,则称为有向图。

    assets/10.jpg

  2. 通常需要将图中顶点按照一个顺序进行标号,如果某个顶点在一个序列中的位置为 i,那么该顶点为顶点 i。

  3. 权/网:与边有关的数据信息被称为权。在具体应用中权值可以有实际意义,比如线路的长度或等级、电路中两个端点之间的电阻电流或电压值等等。每条边上都带权的图称为网络,或 网。问题所属的领域不同,顶点和边的实际意义也就不同。

  4. 度:顶点的度是指连接在某顶点 v 的边数,记 TD(v)。对于有向图,某顶点 v 的入度是指以顶点 v 为终点的弧的数目,记 ID(v),某顶点 v 的出度是指以顶点 v 为起点的弧的数目,记 OD(v),有 TD(v) = ID(v) + OD(v)。如果用 n 表示图中顶点的数目,用 e 表示边或弧的数目,用 TD(vi) 表示顶点 vi 的度,则有以下关系:2e = 从 i = 1 到 i = n 累加 TD(vi)。从这个关系可知,具有 n 个顶点的无向图最多有 n(n - 1)/2,这样的图称为 完全图,具有 n 个顶点的有向图最多有 n(n - 1) 条边,这样的有向图称为 有向完全图。若一个图接近于完全图则称为稠密图,若边或弧的数目很少的图为稀疏图。

  5. 路径/环(回路)/有跟图:在无向图中两个顶点之间的顶点序列可以使得两顶点之间连通一条通路,即路径。这条路径上所包含边的数目被称为该路径的长度。对于有向图,则该路径也是有相的。对于 带权图 路径长度,是指路径上所有边的权值之和。若出发顶点和结束顶点为一个顶点,则该路径为回路或环。在一个有向图中,若存在一个顶点,使得从该顶点出发的路径可以到达图中其他所有顶点,则称该有向图为有根图,该顶点为该有向图的根。

  6. 子图:一个图的子集,包括图的一部分顶点和边。

  7. 图的连通:对于无向图,若从定点 vi 到顶点 vj(i ≠ j)有路径,则称 vi 到 vj 之间是连通的。如果无向图中任意两个顶点之间都是连通的,则称该无向图为连通图。无向图中的极大连通子图称为该图的连通分量,显然对于一个图其只有一个。若有向图中任意两个顶点之间都是连通的,则称该有向图是 强连通图,有向图 中的 极大 强连通子图 称为该 有向图 的 强连通分量。

  8. 生成树:一个 连通图 的 极小连通子图 称为该图的一个 生成树。生成树中不含有回路,在生成树中添加任意一条边必然会产生回路,若在生成树中减少任意一条边则一定会使它成为非连通的。

  9. 生成森林:若一个有向图恰好有一个顶点的入度为 0,其余顶点的入度均为 1,则是一棵有向树,一个有向图的生成森林由若干棵有向树组成。

图的基本操作

图的存储

  1. 邻接矩阵法(不适合稀疏图,因为空间性价比低)。

    12

  2. 邻接表法。

  1. 有向图的十字链表法。略。

图的遍历

从给定图中任意指定的顶点出发,按照某个原则系统的访问图中的其他顶点,每个顶点仅仅被访问一次,得到由该图中顶点组成的一个序列,这个过程称为图的遍历。

图的遍历 通常采用 深度优先搜索 与 广度优先搜索 方式进行。具体看本文下面的 “DFS & BFS(深度/广度优先搜索)”一节。

深度优先遍历(Depth First Search)的主要思想是首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点。当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直至所有的顶点都被访问过。(引自 深度优先遍历与连通分量 | 菜鸟教程 (runoob.com))

广度优先搜索,其遍历原则是从图中指定顶点出发,访问该顶点后再依次访问该顶点的各个未被访问过的邻接点,然后从这些邻接点出发,按照同样的原则依次访问他们的未被访问过的邻接点,以此类推,直到图中所有访问过的顶点的临界点都被访问,若此时图中还存在未被访问过的顶点,则从另一个未被访问过的顶点出发,继续进行上述过程,直到图中所有顶点都被访问。广度优先搜索与深度优先搜索不同,首先访问指定的出发点,然后依次访问该顶点的所有未被访问过的邻接点,再接下来访问邻接点的未被访问过的邻接点,以此类推,实现这个过程需要设置一个队列结构。

图的存储方式、遍历的出发点、遍历的方式等的不同均会使遍历后的序列各不相同。

后续概念

最小生成树、最短路径、AOV网与拓扑结构排序、AOE网与关键路径等。

图论基础和表示 | 菜鸟教程 (runoob.com)。

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

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

相关文章

Junit单元测试异常处理方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Junit单元测试异常处理方法 前言案例准备一、类方法内处理异常二、测试方法中处理异常1.try/catch/finally 语句2.Test(expected)3.ExpectedException 前言 提示&#xff1a…

深度解析shell脚本的命令的原理之mv

mv 是 Unix 或 Linux 中的一个基本命令,用于移动或重命名文件和目录。以下是对这个命令的深度解析: 基本操作:mv 命令的基本操作是将一个或多个源文件或目录移动到一个目标文件或目录,或者重命名源文件或目录。这是通过改变文件系…

银河麒麟--国产操作系统-九五小庞

那么,我国国产操作系统现状到底如何呢? 自 1999 年徐冠华部长一语点破我们的产业软肋之后,国产操作系统起步于国家“七五”计划期间,目前国产操作系统均是基于Linux内核进行的二次开发,中国国产操作系统进入Linux元年…

CSS:隐藏移动端的滚动条的方式

目录 方式一:-webkit-scrollbar方式二:overflow方式三:clip-path方式四:mask 遮罩总结参考 移动端开发中,有一个横向滚动元素,产品告诉我不需要滚动条,我说这个简单,隐藏一下不就行了…

iText实战--在现有PDF上工作

6.1 使用PdfReader读取PDF 检索文档和页面信息 D:/data/iText/inAction/chapter03/image_direct.pdf Number of pages: 1 Size of page 1: [0.0,0.0,283.0,416.0] Rotation of page 1: 0 Page size with rotation of page 1: Rectangle: 283.0x416.0 (rot: 0 degrees) Is reb…

深度思考ES面经

1 推荐文章 2万字详解,吃透 Elasticsearch 2 什么是倒排索引,为什么这么叫? 倒排索引(Inverted Index)是一种为快速全文搜索而设计的数据结构。它被广泛应用于搜索引擎,其中 Elasticsearch(简…

C# 扫描并读取图片中的文字(.NET Core)

本文介绍如何通过C# 程序来扫描并读取图片中的文字,这里以创建一个.Net Core程序为例。下面是具体步骤,供参考。 程序测试环境: Visual Studio版本要求不低于2017 图片扫描工具:Spire.OCR for .NET 图片格式:png&…

JSP ssm 网上求职管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP ssm 网上求职管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采…

zookeeper最基础教程

文章目录 一、简介1、工作机制2、特点3、数据结构4、应用场景5、选举机制 二、软件安装1、单机版安装2、集群安装3、配置参数解读(zoo.cfg)4、ZK集群启动脚本 三、命令行操作1、语法2、使用3、节点相关4、监听器原理5、节点删除与查看 三、写数据流程 一、简介 1、工作机制 官…

SQL优化--排序优化(order by)

Using filesort : 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。 Using index : 通过有序索引顺序扫描直接返回有序数据&#xff0c…

1031. 两个非重叠子数组的最大和

1031. 两个非重叠子数组的最大和 原题链接:完成情况:解题思路:参考代码: 原题链接: 1031. 两个非重叠子数组的最大和 https://leetcode.cn/problems/maximum-sum-of-two-non-overlapping-subarrays/description/ 完…

【C语言】指针的进阶(一)

目录 前言 1. 字符指针 2. 指针数组 3. 数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 4. 数组参数、指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 5. 函数指针 前言 指针在C语言中可谓是有着举足轻重的…

Arm发布 Neoverse V2 和 E2:下一代 Arm 服务器 CPU 内核

9月14日,Arm发布了新的处理器内核:V2和E2,在官网已经可以看到相关的TRM 手册了。。 四年前,Arm发布了Neoverse系列的CPU设计。Arm决定加大力度进军服务器和边缘计算市场,专门为这些市场设计Arm CPU内核,而…

CocosCreator3.8研究笔记(十八)CocosCreator UI组件(二)

前面的文章已经介绍了Canvas 组件、UITransform 组件、Widget 组件 。 想了解的朋友,请查看 CocosCreator3.8研究笔记(十七)CocosCreator UI组件(一)。 今天我们主要介绍CocosCreator 常用容器组件:Layout …

[npm]脚手架本地全局安装1

[npm]脚手架本地全局安装1 npm link 全局安装npm install 全局安装卸载全局安装的脚手架 该文章是你的脚手架已经开发完成的前提下,你想要本地全局安装该脚手架,便于本地使用脚手架的命令的情况 npm link 全局安装 如果本地开发的项目是个脚手架&#…

【C语言】进阶——指针

目录 ①(●◡●)前言 1.字符指针 ✌字符指针和数组笔试题 2.指针数组 和数组指针 👊指针数组 👊数组指针 👊&数组名和数组名 3.数组传参和指针传参 👊一维数组传参 👊二维数组传参 👊一级…

云原生之使用Docker部署Nas-Cab个人NAS平台

云原生之使用Docker部署Nas-Cab个人NAS平台 一、Nas-Cab介绍二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Nas-Cab镜像五、部署Nas-Cab5.1 创建挂载目录5.2 创建Nas-Cab容…

利用idea新创建maven项目时的一些基本配置

1.修改项目默认的maven仓库 file->Settings->Build 2.设置项目的jdk版本 设置完点OK即可。 同样的我们还需要在项目配置中进行修改。 通过以上设置一般就可以解决jdk版本不兼容地方问题。

稀土系储氢合金 压力-组成等温线 PCI 的测试方法

声明 本文是学习GB-T 29918-2023 稀土系储氢合金 压力-组成等温线 PCI 的测试方法. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 5 方法2:电化学法 5.1 方法提要 以储氢合金作负极,烧结氢氧化亚镍作正极,氢氧化钾水溶液作电…

postgresql-视图

postgresql-视图 视图概述使用视图的好处 创建视图修改视图删除视图递归视图可更新视图WITH CHECK OPTION 视图概述 视图(View)本质上是一个存储在数据库中的查询语句。视图本身不包含数据,也被称为 虚拟表。我们在创建视图时给它指定了一个…