【DSA】图-理论基础(1)

数据之间的关系有 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 十字链表存储结构

待续……


声明:本文内容系整理自网络内容,以及增加了个人一点理解。
参考内容:

  1. http://c.biancheng.net/view/3404.html
  2. https://www.cnblogs.com/skywang12345/p/3691463.html
  3. https://www.oschina.net/translate/data-structures-for-beginners-graphs-time-complexity-tutorial
发布了134 篇原创文章 · 获赞 119 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/jobbofhe/article/details/102571401