数据结构——图

前言

在之前的文章中荔枝在数据结构整理了有关树的学习笔记,接下来在这篇文章中荔枝要整理一下有关图的基本知识。


文章目录

前言

一、基础概念

1.1 图的分类

1.2 其它概念

二、图的存储结构

2.1 邻接矩阵

2.2 邻接表

2.3 十字链表

2.4 邻接多重表

2.5 边集数组

总结


一、基础概念

        图其实是一种相对来说比较高级一点的数据结构,相较于只有线性关系的线性表和树形结构,图的结构明显更为复杂。图是由顶点的有穷非空集合和边的集合组成,顶点的有穷非空集合决定了图这一数据结构至少有一个顶点,图可以只有顶点没有边。

1.1 图的分类

        图按照边的有无向性可以分为有向图无向图,不管是有向图还是无向图根据顶点之间的联系方式又可以分为有向完全图、有向图、无向完全图、无向图。在有向完全图中,我们称有向图的边为弧,并用一个有序偶数对<vi,vj>来表示,其中vi称之为起始点或者弧尾、vj被称之为结束点或弧头。 

无向完全图

n个顶点的边的条数:n(n-1)/2

有向完全图

含有n个顶点的有向完全图有n(n-1)条边

1.2 其它概念

        当图的边或是弧各自含有与其相关的数并代表着自身的价值,或者是用于路径消耗的花费,我们一般称之为边/弧的权。如果一张图带有边的,那么就被称之为。我们用度来表示一个顶点自身所关联的边,无向图的度等于各个顶点的度求和后取一半,有向图的度等于入度的求和或者是出度的求和,一个顶点p的入度是以该顶点为终点的有向边的集合,而出度则是以该顶点为起点的有向边的数目。与树形结构类似,图也有子图这一个概念,我们也借助树这一种数据结构引申出连通图生成树这一概念。连通图生成树是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边。成为连通图生成树的条件:图是连通图若图有n个顶点则只有n-1条边

连通图与非连通图:

所谓的连通图其实就是图结构中不含独立的子图,通俗一点来将,我们可以将一个数据点从一个顶点通过顶点和边的联系移动到整个图中的任意位置处。


二、图的存储结构

2.1 邻接矩阵

        对于含有N个节点的图,我们可以使用一个N*N的矩阵A来表示图中边的关系,同时使用一个一维数组来记录图中所有的顶点。在上面荔枝使用一个有序偶数对<vi,vj>来表示两节点之间的边的关系,我们也可以应用在矩阵A中,在矩阵A中的Aij处如果数值为0,则代表vi和vj这两个结点之间不存在边的连接,即<vi,vj>不是图的边。在这里我们对于有权图,我们可以使用Aij来代表权值并记录两个结点之间的联系;对于无权图,我们在Aij处记0或1来分别表示<vi,vj>是图的边和<vi,vj>不是图的边。

需要注意的是:

        不论是有向图还是无向图的邻接矩阵的主对角线上的元素都是0,无向图的邻接矩阵是对称的,即以从左上角到右下角的直线为轴是对称的;而对于有向图来说它的邻接矩阵不是对称的,而判断从vi到vj有没有弧只需要看邻接矩阵的Aij处的数值是否非零。

2.2 邻接表

        在上面我们了解了一种存储图的结构——邻接矩阵,邻接矩阵几乎记录了所有结点之间的关系,但是在一个稀疏图中这样处理无疑会导致大量的资源浪费。图的邻接表使用的是顺序存储和链式存储同时进行的形式,也就是对图的每一个零点创建一个单链表,每个单链表由点域和指针域组成,邻接表的结点主要分为顶点表结点、边表结点。

图的邻接表表示并不唯一,各边结点的链接次序可以是任意的,它取决于建立邻接表的算法及边的输入次序。

 

从邻接表中的一个当链表的结构可以看出,相较树形数据结构其实有点像是链式存储结构。相较于邻接矩阵,对于给定的顶点我们可以比较容易地求出它的所有邻边以及出度,但在有向图中求顶点的入度则需要遍历所有的邻接表,比较复杂。

2.3 十字链表

为了解决在有向图中解决顶点的出度问题提出了一种更为方便的有向图的链式存储结构——十字链表。十字链表其实就是将邻接表和逆邻接表结合起来,其中顶点表合并i岸标的结构如下所示:

借助一个例子来理解:可以看到V0有一个入边V2,一个出边V1。入边指针指向V2边表的入边表指针域,同时出边指针指向自身的边表。也就是说一个结点的入边操作就是将入边指针指向入边的结点或叫做弧尾结点,出边仅需要将出边指针指向自身的边表等待入边指针的操作即可。

 

2.4 邻接多重表

        邻接多重表是无向图的另一种链式存储结构,它的存储过程比较简单,简单理解其实就是ilink和jlink就是边的两端指针,我们将边表和顶点表分别列出来,顶点表指向ivex值与其相同的边表,边表的ivex和jvex指代了一条边的两个端点,如果想从一条边到另一条边,就一定需要经过特定的顶点,因此ilink指向的结点的jvex值应该要跟它本身的ivex值相同。

 

2.5 边集数组

边集数组是由两个一维数组构成。一个是存储顶点信息,另一个是存储边的信息,边数组每条数据由一条边的起点下标(begin)、 终点下标(end)和权(weight)组成。边集数组关注的是边的集合更适合对边依次进行处理的操作,而不适合对顶点相关的操作。

关于这一部分大家可以看一下这位博主的文章: https://blog.csdn.net/Real_Fool_/article/details/114141377


总结

        在这篇文章中,荔枝主要记录了自己学习图的笔记,只能说是大致了解,还是得去做几道题目巩固一下,先将这个阶段的学习笔记记录下来哈哈哈。

今朝已然成为过去,明日依然向往未来!我是小荔枝,在技术成长的路上与你相伴,码文不易,麻烦举起小爪爪点个赞吧哈哈哈~~~ 比心心♥~~~

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值