数据结构之图简介

1,017 阅读3分钟

什么是图

  • 图是网络结构的抽象模型。
  • 图是一组由边连接的节点(或顶点)。 因为任何二元关系都可以用图来表示,所以图的学习就显得尤为重要。

图结构示意图.png

图在数学和技术上的概念

一个图 G = (V, E)由以下元素组成。

  • V:一组顶点。
  • E:一组边,连接 V 中的顶点。

图的相关术语

  • 相邻顶点:由一条边连接在一起的顶点。上图中,A 和 B 是相邻的,A 和 D 是相邻的,A 和 C 是相邻的,A 和 E 不是相邻的。
  • 度:一个顶点的度是其相邻顶点的数量。上图中,A 和其他三个顶点相连接,因此 A 的度为 3;E 和其他两个顶点相连,因此 E 的度为 2。
  • 路径:是顶点 v1, v2, …, vk的一个连续序列,其中 vi和 vi+1是相邻的。在上图中,其中包含路径 A B E I 和 A C D G。
  • 简单路径要求不包含重复的顶点 比如,上图中的A D G 就是一条简单路径。
  • 环也是一个简单路径,因为环的最后一个顶点和第一个顶点是同一个顶点。比如说上图中的A D C A 环。
  • 如果图中不存在环,则称该图是无环的
  • 如果图中每两个顶点间都存在路径,则该图是连通的

图的种类

  • 有向图:是指图的边有方向。

有向图示意图.png 如果图中每两个顶点间在双向上都存在路径,则该图是强连通的。如上图所示,C 和 D 是强连通的, 而 A 和 B 不是强连通的。

  • 无向图:是指图的边没有方向。

图还可以是未加权的或是加权的。 如下图所示,加权图的边被赋予了权值。

加权图示意图.png

图的表示

从数据结构的角度来说,我们有多种方式来表示图。在所有的表示法中,不存在绝对正确的 方式。图的正确表示法取决于待解决的问题和图的类型。

  • 邻接矩阵:图最常见的实现是邻接矩阵。每个节点都和一个整数相关联,该整数将作为数组的索引。我们用一个二维数组来表示顶点之间的连接。如果索引为 i 的节点和索引为 j 的节点相邻,则array[i][j] === 1,否则 array[i][j] === 0

不是强连通的图(稀疏图)如果用邻接矩阵来表示,则矩阵中将会有很多 0,这意味着我们 浪费了计算机存储空间来表示根本不存在的边。例如,找给定顶点的相邻顶点,即使该顶点只有 一个相邻顶点,我们也不得不迭代一整行。邻接矩阵表示法不够好的另一个理由是,图中顶点的 数量可能会改变,而二维数组不太灵活。

  • 邻接表:我们也可以使用一种叫作邻接表的动态数据结构来表示图。邻接表由图中每个顶点的相邻顶点列表所组成。存在好几种方式来表示这种数据结构。我们可以用列表(数组)、链表,甚至是散列表或是字典来表示相邻顶点列表。

尽管邻接表可能对大多数问题来说都是更好的选择,但以上两种表示法都很有用,且它们有 着不同的性质(例如,要找出顶点 v 和 w 是否相邻,使用邻接矩阵会比较快)。

  • 关联矩阵:还可以用关联矩阵来表示图。在关联矩阵中,矩阵的行表示顶点,列表示边。如下图所示,使用二维数组来表示两者之间的连通性,如果顶点 v 是边 e 的入射点,则 array[v][e] === 1;否则,array[v][e] === 0。 关联矩阵通常用于边的数量比顶点多的情况,以节省空间和内存。