数据之间的关系有 3 种,分别是 “一对一”、“一对多” 和 “多对多”,前两种关系的数据可分别用线性表和树结构存储,具有"多对多"逻辑关系数据的结构——图。
1. 图的定义
定义:图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的;其中,点通常被成为"顶点(vertex)",而点与点之间的连线则被成为"边或弧"(edege)。通常记为,G=(V,E)。
2 图的分类
分类依据:是否有方向
两大类:无向图、有向图。
-
无向图
图一 -
有向图
图二
简单的来说,有向图和无向图的区别就是从顶点到另一个顶点是否只存方向性。比如说,上图有向图是航班图,也就是说,从V3到V4有航班,但是要从V4到V3只能是V4->V1->V3.
与链表不同,图中存储的各个数据元素被称为顶点(而不是节点)
图存储结构中,习惯上用 Vi 表示图中的顶点,且所有顶点构成的集合通常用 V 表示,如图 一 中顶点的集合为 V={V1,V2,V3,V4}。
3 图的基本属性
- 弧头和弧尾
有向图中,无箭头一端的顶点通常被称为"初始点"或"弧尾",箭头直线的顶点被称为"终端点"或"弧头"。
- 入度和出度
对于有向图中的一个顶点 V 来说,箭头指向 V 的弧的数量为 V 的入度(InDegree,记为 ID(V));箭头远离 V 的弧的数量为 V 的出度(OutDegree,记为OD(V))。拿图 2 中的顶点 V1来说,该顶点的入度为 1,出度为 2(该顶点的度为 3)。
- (V1,V2) 和 <V1,V2> 的区别
无向图中描述两顶点(V1 和 V2)之间的关系可以用 (V1,V2) 来表示,而有向图中描述从 V1 到 V2 的"单向"关系用 <V1,V2> 来表示。
由于图存储结构中顶点之间的关系是用线来表示的,因此 (V1,V2) 还可以用来表示无向图中连接 V1 和 V2 的线,又称为边;同样,<V1,V2> 也可用来表示有向图中从 V1 到 V2 带方向的线,又称为弧。
- 集合 VR 的含义
并且,图中习惯用 VR 表示图中所有顶点之间关系的集合。例如,图 1 中无向图的集合 VR={(v1,v2),(v1,v4),(v1,v3),(v3,v4)},图 2 中有向图的集合 VR={<v1,v2>,<v1,v3>,<v3,v4>,<v4,v1>}。
- 路径和回路
无论是无向图还是有向图,从一个顶点到另一顶点途径的所有顶点组成的序列(包含这两个顶点),称为一条路径。如果路径中第一个顶点和最后一个顶点相同,则此路径称为"回路"(或"环")。
并且,若路径中各顶点都不重复,此路径又被称为"简单路径";同样,若回路中的顶点互不重复,此回路被称为"简单回路"(或简单环)。
拿图 1 来说,从 V1 存在一条路径还可以回到 V1,此路径为 {V1,V3,V4,V1},这是一个回路(环),而且还是一个简单回路(简单环)。
在有向图中,每条路径或回路都是有方向的。
- 权和网的含义
在某些实际场景中,图中的每条边(或弧)会赋予一个实数来表示一定的含义,这种与边(或弧)相匹配的实数被称为"权",而带权的图通常称为网。如图 3 所示,就是一个网结构:
图 三 带权的图存储结构
在学习“哈弗曼树”的文章中,已经了解了“权”的概念。这里图的权与之类似。
子图:指的是由图中一部分顶点和边构成的图,称为原图的子图。
4. 图的结构
根据不同的特征,我们将图划分为完全图,连通图、稀疏图和稠密图。
- 完全图
也就是说,每一个节点都和除了自身之外的所有节点相连。
完全图分两种,无向和有向。
具有 n 个顶点的完全图,图中边的数量为 n(n-1)/2;而对于具有 n 个顶点的有向完全图,图中弧的数量为 n(n-1)。 - 连通图
简单来说,就是图中任意连个顶点,都可以通过某条路径找到对方。
连通图:
非连通图:
- 稀疏图和稠密图
稀疏和稠密的判断条件是:
e<nlogn,其中 e 表示图中边(或弧)的数量,n 表示图中顶点的数量。如果式子成立,则为稀疏图;反之为稠密图。
5 图的存储类型
5.1 顺序存储结构
简单的来说,就是使用数组来存储图。使用一维数组存储节点,在使用另一个二维数组存储出顶点之间的关系。
5.2 邻接矩阵存储结构
说的是,使用矩阵来表示图的逻辑关系。如下图所示
- 无向图G1
- G1的临接矩阵
映射关系:顶点和另一个顶点之间没有弧或者边的存在,则记为0,否则记为1.
说明: - 如果是有向图,那么如果是A–>B,则AB标识为1, BA标识为0。
- 上边提到,一个一维数组用来保存顶点信息,一个二维数组来用保存边的信息,从图中我们可以看到,存在大量的 0 元素,这就引出了邻接矩阵的缺点耗费空间。
5.3 邻接表存储结构
为了解决邻接矩阵耗费空间的缺点。我们引入了邻接表。所谓邻接表,简单来说,就是将与当前节点有连接的节点的下标记录下来。详细如下图:
以5.2节,无向图G1为例。其邻接表是:
5.4 十字链表存储结构
待续……
声明:本文内容系整理自网络内容,以及增加了个人一点理解。
参考内容: