数据结构 图

admin
admin 2019年08月03日
  • 在其它设备中阅读本文章

一、定义

是由 顶点 的有穷非空集合和顶点之间 的集合组成,通常表示为:G(V,E),其中,G 表示一个图,V 是图 G 中顶点的集合,E 是图 G 中边的集合。图中不允许没有顶点,但是可以没有边

基本术语:

  • 有向边 : 顶点之间的边有方向,简称,箭头的一边为 弧头 ,另一边为 弧尾 ;如果边没有方向则是 无向边
  • 有向图 :任意两个顶点之间的边均是有向边的图;如果均是无向边就是 无向图
  • 完全图 :任意两顶点之间都存在边的无向图是 无向完全图 ;任意两顶点之间都存在两条边的有向图是 有向完全图
  • 稠密图 :一个含有较多边的图;相对的,含有较少边的图时 稀疏图
  • 顶点的度 :连接该顶点的边的数量;在有向图中,该顶点入边数量是 入度 ,该顶点出边数量是 出度
  • 邻接 :两个顶点之间有边;有向边的起始顶点称为 入边邻接顶点 ,有向边的结束顶点称为 出边邻接顶点
  • 路径 :图中首尾相连的一组边;首和尾是同一个顶点的路径称为
  • 简单路径 :不存在环的路径;首和尾是同一个顶点的简单路径称为 简单回路 简单环
  • 连通图 :任意两个顶点都存在路径的图;如果该图是有向图则称 强连通图
  • 弱连通图 :将有向图的所有有向边替换为无向边,得到的图称为原图的 基图 ,基图为连通图的有向图是 弱连通图
  • :与边相关的数值;如果一个图的边有权则是 有权图 ,否则就是 无权图 ,有权图简称

基本操作:

  • 按照顶点集和边集构造图
  • 销毁已存在的图
  • 获取顶点在图中的位置
  • 返回图中指定顶点的值
  • 在图中插入新的顶点
  • 删除图中的顶点及其相关的边
  • 在图中添加边
  • 在图中删除边
  • 深度优先遍历并执行调用
  • 广度优先遍历并执行调用

二、图的遍历

从图中某一顶点出发访问图中其余顶点,且每一个顶点仅被访问一次,这个过程称为 图的遍历 。根据搜索方法的不同,又可以划分为两种搜索策略:

  • 深度优先搜索(DFS):类似于树的先序遍历。从图中某个顶点 V 出发,访问该顶点,然后依次从 V 的未被访问的邻接点出发继续深度优先遍历图中的其余顶点,直至图中所有和 V 有路径相通的顶点都被访问完为止。
  • 广度优先搜索(BFS):是一个分层遍历的过程,和树的层序遍历算法类同。从图的某一顶点 V 出发,访问此顶点后,依次访问 V 的邻接点;然后分别从这些邻接点出发,直至图中所有已被访问的顶点的邻接点都被访问到。

三、存储结构

1、邻接矩阵

存储方式是用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边的信息,若图有 N 个顶点,则邻接矩阵就是一个 N×N 的方阵。
对于有向图和无向图,矩阵第 i 个元素存储记录图的第 i 个顶点是否能到达第 j 个顶点,若能记为 1,不能记为 0,i 和 j 相等也记为 0,而无向图的边视为双向边。特别的,无向图的邻接矩阵是一个对称矩阵。
无向图.png
有向图.png
对于有权的图,第 i 个元素存储记录图的第 i 个顶点到达第 j 个顶点的权,不能到达的记为∞,i 和 j 相等记为 0。
有权图.png

2、邻接表

对于边数相对顶点较少的图,邻接矩阵存在对存储空间的极大浪费的。因此我们考虑另外一种存储结构方式:邻接表,即数组与链表相结合的存储方法。用一个一维数组存储图中顶点信息,用单链表存储所有顶点的邻接点,无向图称为顶点的边表,有向图称为顶点的出边表,如果存储的是入边表,则称为 有向图的逆邻接表 ,如果是有权图,可以在边表结点定义中添加一个数据项来存储权值

3、十字链表

对于有向图来说,邻接表是有缺陷的,关心了出度问题,想了解入度就必须要遍历整个图才能知道,反之,逆邻接表也是类似的情况。可以把邻接表与逆邻接表结合起来,即有向图的一种存储方法十字链表。即在有向图的邻接表的边表结点定义中再增加一个入度指针。
十字链表.png

4、邻接多重表

虽然邻接表是无向图的一种很有效的存储结构, 在邻接表中容易求得顶点和边的各种信息. 但是, 在邻接表中每一条边 (vi,vj) 有两个结点,分别在第 i 个和第 j 个链表中,这给某些图的操作带来不便。如对已被搜索过的边作记号或删除一条边等,此时需要找到表示同一条边的两个结点。可采用邻接多重表。
邻接多重表.png

5、边集数组

由两个数组一维数组组成。一个一维数组存储图中顶点信息,另一个一个存储边信息,边数组的每个数据元素由一条边的起点下标、终点下标组成,如果是有权图,可以增加一个数据项存储权。
边集数组.png

6、存储结构比较

存储方法 实现方法 优点 缺点
邻接矩阵 二维数组 顶点间关系和度易得 占用空间大
邻接表 链表数组 顶点的出度易得 顶点间关系和入度不易得
十字链表 链表数组 易得出度和入度 结构复杂
邻接多重表 链表数组 易得顶点间的关系 结构复杂
边集数组 一维数组 空间要求小 顶点间关系和度不易得