9.1 数据结构之图的基本概念及存储结构

前面8章都是比较基础的数据结构与算法,当然各章也有一些较深的知识。之后的章节,都是进阶的数据结构与算法的知识了。

这一章我们介绍更复杂的数据结构——

图状结构是一种比树形结构更复杂的非线性结构。在树状结构中,结点间具有分支层次关系,每一层上的结点只能和上一层中的至多一个结点相关,但可能和下一层的多个结点相关。而在图状结构中,任意两个结点之间都可能相关,即结点之间的邻接关系可以是任意的。因此,图状结构被用于描述各种复杂的数据对象,在自然科学、社会科学和人文科学等许多领域有着非常广泛的应用。

图延伸出来的概念和问题更是多而复杂,关于图这部分的学习建议分四步或者说由浅及深:

  1. 掌握图的基本概念和各种术语,了解图的存储结构,对后面深入的知识了解知识大框架;
  2. 掌握图的遍历方式,掌握图的代码实现,能够简单应用;
  3. 难点: 图的连通性及生成树、生成森林的概念,掌握最小生成树的算法;
  4. 最短路径算法及图的其他应用。

这部分也可参考各种博客,都很详细。

8.1 图的基本概念

数据结构:图概念与基本图实现

数据结构(七)图

图的概念

概念很好理解,记住顶点Vertex, 边Edge即可。

图中,数据元素vi 称为顶点(vertex );P(vi, vj)表示在顶点vi 和顶点vj 之间有一条直接连线。如果是在无向图中,则称这条连线为边;如果是在有向图中,一般称这条连线为弧。边用顶点的无序偶对(vi, vj)来表示,称顶点vi和顶点vj 互为邻接点,边(vi, vj)依附于顶点vi 与顶点vj;弧用顶点的有序偶对<vi, vj>来表示,有序偶对的第一个结点vi 被称为始点(或弧尾),在图中就是不带箭头的一端;有序偶对的第二个结点vj 被称为终点(或弧头),在图中就是带箭头的一端。

  • 邻接(adjacency):邻接是两个顶点之间的一种关系。如果图包含边(u,v),则称顶点v与顶点u邻接。当然,在无向图中,这也意味着顶点u与顶点v邻接。
  • 关联(incidence):关联是边和顶点之间的关系。在有向图中,边(u,v)从顶点u开始关联到v,或者相反,从v关联到u。注意,有向图中,边不一定是对称的,有去无回是完全有可能的。

相关术语

首先,有向图和无向图

  • 无向图。在一个图中,如果任意两个顶点构成的偶对(vi, vj)∈E 是无序的,即顶点之间的连线是没有方向的,则称该图为无向图。如图8.1 所示是一个无向图G1。
  • 有向图。在一个图中,如果任意两个顶点构成的偶对(vi, vj)∈E 是有序的,即顶点之间的连线是有方向的,则称该图为有向图。如图8.2 所示是一个有向图G2:

再看完全图的概念

  • 无向完全图。在一个无向图中,如果任意两顶点都有一条直接边相连接,则称该图为无向完全图。可以证明,在一个含有n 个顶点的无向完全图中,有n(n-1)/2 条边。
  • 有向完全图。在一个有向图中,如果任意两顶点之间都有方向互为相反的两条弧相连接,则称该图为有向完全图。在一个含有n 个顶点的有向完全图中,有n(n-1)条边。

稠密图、稀疏图。若一个图接近完全图,称为稠密图;称边数很少的图为稀疏图。

顶点的度、入度、出度。顶点的度(degree)是指依附于某顶点v 的边数,通常记为TD (v)。在有向图中,要区别顶点的入度与出度的概念。顶点v 的入度是指以顶点为终点的弧的数目。记为ID (v);顶点v 出度是指以顶点v 为始点的弧的数目,记为OD (v)。有TD (v)=ID (v)+OD (v)。

可以证明,对于具有n 个顶点、e 条边的图,顶点vi 的度d与顶点的个数以及边的数目满足关系:

                                                              e=\frac{1}{2}\sum_{i=1}^{n}d_{i}

即一个图中所有顶点的度之和等于边数的两倍。

子图。对于图G=(V,E),G’=(V’,E’),若存在V’是V 的子集,E’是E的子集,则称图G’是G 的一个子图。

路径、路径长度。顶点vp 到顶点vq 之间的路径(path)是指顶点序列vp,vi1,vi2, …,vim,vq.。其中,(vp,vi1),(vi1,vi2),…,(vim,.vq)分别为图中的边。路径上边的数目称为路径长度。序列中顶点不重复出现的路径称为简单路径。图8.1 所示的无向图G1 中,v1→v4→v3→v5 与v1→v2→v5 是从顶点v1 到顶点v5 的两条路径,路径长度分别为3 和2,且都是简单路径。

回路或环(cycle)。若一条路径上开始点与结束点为同一个顶点,则此路径称为回路或环。开始点与结束点相同的简单路径称为简单回路,或者简单环。如图8.2 中的v1→v3→v4→v1。

权、网。图中每一条边都可以附有一个对应的数值,这种与边有关的数据信息称为权(weight)。在实际应用中,权值可以有某种含义。比如,在一个反映城市交通线路的图中,边上的权值可以表示该条线路的长度或者等级或者消耗;对于一个电子线路图,边上的权值可以表示两个端点之间的电阻、电流或电压值;对于反映工程进度的图而言,边上的权值可以表示从前一个工程到后一个工程所需要的时间等等。边上带权的图称为网或网络(network)。

下面的这些概念与图的连通性有关:

连通、连通图、连通分量。在无向图中,如果从一个顶点vi 到另一个顶点vj(i≠j)有路径,则称顶点vi 和vj 是连通的。如果图中任意两顶点都是连通的,则称该图是连通图,否则称为非连通图。无向图的极大连通子图称为连通分量,对于任何连通图,连通分量只有一个,即它本身;而非连通图,有多个连通分量。

强连通图、强连通分量。对于有向图来说,若顶点vi到顶点vj有路径,则称从vi到vj是连通的。若图中任意一对顶点vi 和vj(i≠j)均有从vi 到vj 的路径,及从vj 到vi 的路径,则称该有向图是强连通图。有向图的极大强连通子图称为强连通分量。对于任何强连通图,只有一个强连通分量,即它本身;非强连通图有多个强连通分量。

生成树、生成森林。所谓连通图G 的生成树,是G 的包含其全部n 个顶点的一个极小连通子图。它必定包含且仅包含G 的n-1 条边。在生成树中添加任意一条属于原图中的边必定会产生回路,因为新添加的边使其所依附的两个顶点之间有了第二条路径。若生成树中减少任意一条边,则必然成为非连通的。在非连通图中,由每个连通分量都可得到一个极小连通子图,即一棵生成树。这些连通分量的生成树就组成了一个非连通图的生成森林。

生成树和生成森林,都是针对无向图的概念,不理解也没关系,可以看后面章节的内容。

图的术语还有不少,基础的就是这些了。

图的存储结构

图的存储结构除了要存储图中各个顶点本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息)。

图最常见的表示形式为邻接链表邻接矩阵。邻接链表在表示稀疏图时非常紧凑而成为了通常的选择,相比之下,如果在稀疏图表示时使用邻接矩阵,会浪费很多内存空间,遍历的时候也会增加开销。如果图是稠密图,邻接链表的优势就不明显了,那么就可以选择更加方便的邻接矩阵。
还有,顶点之间有多种关系的时候,也不适合使用矩阵。因为表示的时候,矩阵中的每一个元素都会被当作一个表。

一、邻接矩阵

邻接矩阵存储使用2个数组存储图的信息:一个一维数组存储顶点,一个二维数组存储边的信息
(1)二维数组中的对角线为0,因为不存在顶点到自身的边
(2)要知道某个点的出度,就是顶点vi在第i行的元素之和,入度就是该顶点所在列的元素之和
(3)顶点vi的所有邻接点就是把矩阵中第i行元素扫描一遍
          邻接矩阵.PNG-38.8kB
(4)对于有权值的网,二维数组中的元素不再是0,1表示是否存在边,而是把元素值表示为权值。不存在的边,权值记录为∞∞;对角线上的权值为0.
2.PNG-64.8kB

 

 (5) 图的邻接矩阵表示是唯一的;

 (6) 无向图的邻接矩阵是一个对称矩阵,按照压缩存储的思想,邻接矩阵只需存放上或下三角形阵的元素即可;

 (7) 不带权的有向图的邻接矩阵一般是稀疏矩阵,当顶点较多时可采用三元组表的方法存储邻接矩阵;

 

二. 邻接表

邻接矩阵对于顶点多而边数少的稀疏图造成存储空间的大量浪费。正如线性表的预先分配可能造成存储空间浪费,因此引入链式存储结构。同样可以考虑用链表存储边或弧。

邻接表:数组 + 链表
(1)用数组存储每个顶点;
(2)数组中的每个顶点的所有邻接点组成一个链表(因为邻接点的个数不确定)。这个邻接表就是顶点的出度表;
(3)邻接表的图形表示
adjarr.PNG-57.8kB
(4)邻接表关心了出度,但是查找入度就需要遍历整个图;

  (5)  每个节点主要由顶点的信息,下一条边的节点的地址及其他信息组成;

  (6)  邻接表表示不唯一,在每个顶点对应的单链表中,各节点次序任意。


图的基础知识就这些了,理解即可,没有什么要实现的;看图的存储结构,可以想到,图的遍历方式,也是遍历二维数组,或者数组+链表。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值