数据结构铁轨问题_每天5分钟用C#学习数据结构(20)图 Part 1

da4507587ae05a657d8653bd9f5ae81f.png

【基础知识】| 作者 / Edison Zhou

这是恰童鞋骚年的第216篇原创文章


前面已经介绍了线性表和树两类数据结构,线性表中的元素是“一对一”的关系,树中的元素是“一对多”的关系,本章所述的图结构中的元素则是“多对多”的关系。图(Graph)是一种复杂的非线性结构,在图结构中,每个元素都可以有零个或多个前驱,也可以有零个或多个后继,也就是说,元素之间的关系是任意的。现实生活中的很多事物都可以抽象为图,例如世界各地接入Internet的计算机通过网线连接在一起,各个城市和城市之间的铁轨等等。

f86bbdb8ff0529136c9b4ea8b5d6537e.png

1图的基本概念

多对多的复杂关系

9449d84f2e567de7b51d0714eb7f5cb2.png

现实中人与人之间关系非常复杂,比如我认识的朋友,可能他们之间也互相认识,这不是简单的一对一、一对多、研究人际关系很自然会考虑多对多的情况。图是一种较线性表和树更加复杂的数据结构。在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。

定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。

在图中需要注意的是:

(1)线性表中我们把数据元素叫元素,树中将数据元素叫结点,在图中数据元素,我们则称之为顶点(Vertex)。

(2)线性表可以没有元素,称为空表;树中可以没有节点,称为空树;但是,在图中不允许没有顶点(有穷非空性)。

(3)线性表中的各元素是线性关系,树中的各元素是层次关系,而图中各顶点的关系是用边来表示(边集可以为空)。

纷繁冗多的术语

图的基本术语有很多,本文只挑选几个特别重要的来说明,其余的请阅读相关教材。

(1)无向图

3de65eac32a871c0cc4ad13512e6e1a3.png

如果图中任意两个顶点之间的边都是无向边(简而言之就是没有方向的边),则称该图为无向图(Undirected graphs)。

(2)有向图

30d72e96ce2f38ed2c1f5a706ec73e59.png

如果图中任意两个顶点之间的边都是有向边(简而言之就是有方向的边),则称该图为有向图(Directed graphs)。

(3)完全图

① 无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。(含有n个顶点的无向完全图有(n×(n-1))/2条边)如下图所示:

2d8c48a773fcede537f74f8b52111a21.png

② 有向完全图:在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。(含有n个顶点的有向完全图有n×(n-1)条边)如下图所示:

f7068b6a803bcdc8410f71488ffae5de.png

PS:当一个图接近完全图时,则称它为稠密图(Dense Graph),而当一个图含有较少的边时,则称它为稀疏图(Spare Graph)。

(4)顶点的度

顶点Vi的度(Degree)是指在图中与Vi相关联的边的条数。对于有向图来说,有入度(In-degree)和出度(Out-degree)之分,有向图顶点的度等于该顶点的入度和出度之和。

(5)邻接

① 若无向图中的两个顶点V1和V2存在一条边(V1,V2),则称顶点V1和V2邻接(Adjacent);

② 若有向图中存在一条边,则称顶点V3与顶点V2邻接,且是V3邻接到V2或V2邻接直V3;

PS:无向图中的边使用小括号“()”表示,而有向图中的边使用尖括号“<>”表示。

(6)路径

在无向图中,若从顶点Vi出发有一组边可到达顶点Vj,则称顶点Vi到顶点Vj的顶点序列为从顶点Vi到顶点Vj的路径(Path)。

(7)连通

若从Vi到Vj有路径可通,则称顶点Vi和顶点Vj是连通(Connected)的。

(8)权

7c2b459941da467f2eb2f8842cd464cc.png

有些图的边或弧具有与它相关的数字,这种与图的边或弧相关的数叫做权(Weight)。

2图的存储结构

图的存储结构除了要存储图中的各个顶点本身的信息之外,还要存储顶点与顶点之间的关系,因此,图的结构也比较复杂。

常用的图的存储结构有邻接矩阵和邻接表等。

邻接矩阵表示法

图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。

(1)无向图:

53d9d2ced963b033e11be143a7a2795b.png

我们可以设置两个数组,顶点数组为vertex[4]={v0,v1,v2,v3},边数组arc[4][4]为上图右边这样的一个矩阵。对于矩阵的主对角线的值,即arc[0][0]、arc[1][1]、arc[2][2]、arc[3][3],全为0是因为不存在顶点的边。

(2)有向图:

我们再来看一个有向图样例,如下图所示的左边。顶点数组为vertex[4]={v0,v1,v2,v3},弧数组arc[4][4]为下图右边这样的一个矩阵。主对角线上数值依然为0。但因为是有向图,所以此矩阵并不对称,比如由v1到v0有弧,得到arc[1][0]=1,而v到v没有弧,因此arc[0][1]=0。

1e09e956b85f9d4f0910005b0196e894.png

不足:由于存在n个顶点的图需要n*n个数组元素进行存储,当图为稀疏图时,使用邻接矩阵存储方法将会出现大量0元素,这会造成极大的空间浪费。这时,可以考虑使用邻接表表示法来存储图中的数据。

邻接表表示法

首先,回忆我们在线性表时谈到,顺序存储结构就存在预先分配内存可能造成存储空间浪费的问题,于是引出了链式存储的结构。同样的,我们也可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题。

邻接表由表头节点和表节点两部分组成,图中每个顶点均对应一个存储在数组中的表头节点。如果这个表头节点所对应的顶点存在邻接节点,则把邻接节点依次存放于表头节点所指向的单向链表中。

(1)无向图:下图所示的就是一个无向图的邻接表结构。

75bf2bb23d3016b8d8f561da97b8742d.png

从上图中我们知道,顶点表的各个结点由data和firstedge两个域表示,data是数据域,存储顶点的信息,firstedge是指针域,指向边表的第一个结点,即此顶点的第一个邻接点。边表结点由adjvex和next两个域组成。adjvex是邻接点域,存储某顶点的邻接点在顶点表中的下标,next则存储指向边表中下一个结点的指针。例如:v1顶点与v0、v2互为邻接点,则在v1的边表中,adjvex分别为v0的0和v2的2。

PS:对于无向图来说,使用邻接表进行存储也会出现数据冗余的现象。例如上图中,顶点V0所指向的链表中存在一个指向顶点V3的同事,顶点V3所指向的链表中也会存在一个指向V0的顶点。

(2)有向图:若是有向图,邻接表结构是类似的,但要注意的是有向图由于有方向的。因此,有向图的邻接表分为出边表和入边表(又称逆邻接表),出边表的表节点存放的是从表头节点出发的有向边所指的尾节点;入边表的表节点存放的则是指向表头节点的某个顶点,如下图所示。

10aef4eab478f554bde62b82bf7a1435.png

(3)带权图:对于带权值的网图,可以在边表结点定义中再增加一个weight的数据域,存储权值信息即可,如下图所示。

629a78db2e7b85cad59eafa173c7b46e.png

3小结

本篇介绍了图的基本概念、重要术语及两种不同的存储结构:邻接表和邻接矩阵。下一篇,我们会用C#代码来实现图的邻接表存储结构的实现(邻接矩阵容易造成空间资源的浪费)。

4参考资料

程杰,《大话数据结构》

陈广,《数据结构(C#语言描述)》

段恩泽,《数据结构(C#语言版)》

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

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

相关文章

Mac上最好的Markdown文本编辑器_编辑工具

Bear Typora iPic 支持预览&#xff0c;图片不在本地&#xff0c;很多人推荐 Typed Ulysses 对 Code 片段支持不好 Mou 支持预览 MWeb 支持本地图片和图床 Byword 无法预览&#xff0c;对 Code 片段支持不好 Sublime Text 不支持预览 插件 OmniMarkupPreviewer Markdo…

中国大学生计算机设计大赛云南,第14届中国大学生计算机设计大赛云南赛区决赛举行...

掌上春城讯6月19日&#xff0c;2021 年“浪潮杯”云南省大学生计算机设计大赛暨第 14 届中国大学生计算机设计大赛云南赛区决赛在云南工商学院举行。中国大学生计算机设计大赛属于全国高等学校一类竞赛&#xff0c;是一个国家级的以实现高等学校计算机教育培养目标为核心的创新…

jvm gc,gc算法_GC解释:算法

jvm gc,gc算法如前一篇文章中所述&#xff0c;HotSpot JVM中有四个可用的垃圾收集器。 它们之间有一些显着差异&#xff0c;但是用于完成实际工作的算法背后的实际概念非常相似。 在这篇简短的文章中&#xff0c;我将尝试解释三种基本算法&#xff1a; 打标 打标紧凑 标记复…

python 链表倒数第k个节点_链表-删除单链表中倒数第k个节点

题目实现一个函数&#xff0c;一个可以删除单链表中倒数第k个节点难度简单分析本题比较简单&#xff0c;实现方法多种多样&#xff0c;这里提供一种方法首先明确一点&#xff0c;在单链表中删除倒数第k个节点&#xff0c;需要找到他的前一个节点&#xff0c;让前一个节点指向后…

SSL 和 TLS 介绍

SSL(Secure Sockets Layer 安全套接层)及其继任者传输层安全&#xff08;Transport Layer Security&#xff0c;TLS&#xff09; 是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。 SSL 功能&#xff1a; 认证用户和服务器&#xff…

天津计算机中级职称需要什么,天津市中级职称评定条件是什么

天津市中级职称评定条件是什么作者&#xff1a;职称驿站浏览量&#xff1a;5351104时间&#xff1a;2019-04-15转眼间2019年马上就要过完三分之一了&#xff0c;对于2019年的职称评审有很多人早早就开始了相关的准备工作&#xff0c;也有一些人才刚刚想到评审的事情&#xff0c…

jsf el表达式_JSP,JSF和EL简介

jsf el表达式JavaServer页面&#xff0c;JavaServer Faces和表达语言 在本文中&#xff0c;我将研究JavaServer Pages&#xff08;JSP&#xff09;和Expression Language&#xff08;EL&#xff09;&#xff0c;然后将其与JavaServer Faces &#xff08;JSF&#xff09;关联。 …

wxpython多线程消息传递_wxpython多线程间通信

#!bin/bash/python#-*- codingutf-8 -*-importtimeimportwxfrom threading importThreadfrom wx.lib.pubsub importpubclassTestThread(Thread):def __init__(self):Thread.__init__(self)self.start()defrun(self):#线程执行的代码for i in range(101):time.sleep(0.03)wx.Cal…

浅谈防火墙对 FTP 的影响及故障排除

FTP 是常见的基于TCP的网络服务&#xff0c;它使用了两个TCP连接来建立逻辑通信信道&#xff0c;即控制连接和数据连接。当客户端与服务器建立一个FTP会话时&#xff0c;使用TCP创建一个持久的控制连接以传递命令和应答。当发送文件和其它数据传输时&#xff0c;它们在独立的TC…

电子计算机职业40201,天津滨海中等专业学校

一、招生专业1.生物技术制药专业培养:该专业学生主要面向生物技术制药的相关医药企业&#xff0c;具备生物技术制药生产岗位的工作能力。在校学习期间学习生物药物的生产、质量控制、经营、设备维护及药物研发助理等职业技能&#xff0c;在校期间可获得酶制剂制造工职业资格证书…

wps 呼叫方拒绝呼叫_呼叫我或异步REST

wps 呼叫方拒绝呼叫本文是使用Spring Boot Java 8制作的工作正常的异步REST应用程序的非常简单的示例。SpringBoot使开发Web应用程序几乎非常容易&#xff0c;但是为了简化任务&#xff0c;我从Spring存储库中举了一个例子&#xff0c;称为rest- service &#xff0c;将其分叉…

定向输出命令_数据流的世界,带你了解Linux重定向

今天&#xff0c;小编就带大家一起来看看数据重定向。重定向&#xff1a;将原本输出到标准输出的数据重定向到一个文件中。用于终端显示输出的特殊设备&#xff1a;IO重定向是为了改变默认输入、输出的位置&#xff1a;输出重定向(标准输出STDOUT和标准错误输出STDERR)【>】…

SSH(Secure Shell) 介绍一

文章目录基本原理首次建立连接的时候的公钥交换通过ssh来进行密码登录利用公钥来登录基本原理 SSH&#xff08;Secure Shell&#xff09;是一套协议标准&#xff0c;可以用来实现两台机器之间的安全登录以及安全的数据传送&#xff0c;其保证数据安全的原理是非对称加密。 传…

影响个人计算机系统功能的因素,影响个人计算机系统功能的因素除了系统使用哪种位的微处理器外,还有CPU的时钟频率、CPU主内存容量、CPU所能提供的指令集。...

影响个人计算机系统功能的因素除了系统使用哪种位的微处理器外&#xff0c;还有CPU的时钟频率、CPU主内存容量、CPU所能提供的指令集。更多相关问题根据《空气质量恶臭的测定三点比较式臭袋法》(GB&#xff0f;T14675-1993)&#xff0c;臭气浓度是指用无臭空气对恶臭样品连续稀…

gc 堆外_GC解释:堆

gc 堆外世代垃圾收集器 JVM堆分为两个不同的世代。 一种称为“年轻”&#xff0c;第二种称为“老”&#xff08;有时称为终身制&#xff09;。 年轻一代又分为两个主要的逻辑部分&#xff1a;伊甸园和幸存者空间。 垃圾收集人员还使用了虚拟空间供年轻人和老年人使用&#xff0…

predicate 列存储索引扫描_ColumnStore index (列存储索引)解析

简介首先介紹列存储的概念&#xff1a; 传统的数据库存储是行存储。对于SQL Server来说&#xff0c;每个page是8K&#xff1b;往page里面塞数据&#xff0c;假设该表每条数据长度是500字节&#xff0c;那么这个page 先塞第一条数据&#xff0c;然后再塞第二条数据&#xff0c;大…

数据传输协议汇总

文章目录一、FTP(File Transfer Protocol 文件传输协议)&#xff08;一&#xff09;FTP 通讯端口&#xff08;二&#xff09;FTP 支持两种连接模式&#xff08;三&#xff09;缺点&#xff08;四&#xff09;FTP 命令&#xff08;五&#xff09;FTP 响应码&#xff08;六&#…

得力科学计算机怎么求余,山商“郭叔”:妙招讲高数 考研路上得力导师

山东工商学院数学与信息科学学院教授郭林大众网海报新闻记者 屈晨晨 烟台报道“郭老师人特别和蔼&#xff0c;能够和学生们打成一片&#xff0c;不仅讲课风趣&#xff0c;同时也给予了我们很多帮助&#xff0c;私底下我们都喊他郭叔。”这是山东工商学院很多毕业生对郭老师的评…

如何打开笔记本电脑的摄像头_Win8系统笔记本电脑摄像头无法使用的解决办法...

Win8系统电脑摄像头不能用怎么办&#xff1f;使用Win8系统笔记本电脑的用户反映&#xff0c;电脑摄像头无法使用了&#xff0c;这是怎么回事呢&#xff1f;如何解决这个问题&#xff1f;请看下文。解决方法&#xff1a;1、打开计算机中的“控制面板”&#xff0c;如图所示&…

浅析文件传输协议 (ftp) 的工作原理

起初&#xff0c;FTP并不是应用于IP网络上的协议&#xff0c;而是ARPANEt网络中计算机间的文件传输协议&#xff0c; ARPANET是美国国防部组建的老网络&#xff0c;于1960-1980年使用。在那时&#xff0c; FTP的主要功能是在主机间高速可靠地传输文件。目前FTP仍然保持其可靠性…