本文已参与「新人创作礼」活动,一起开启掘金创作之路。
先回顾下逻辑结构
图是逻辑结构中最复杂的结构关系
定义和术语
图
G=(V,E) Graph=(Vertex,Edge) V: 顶点(数据元素)的有穷非空集合 E:边的有穷集合
有向图/无向图
有向图:每条边都是有方向的
无向图:每条边都是无方向的
有向图和无向图对比
完全图
完全图:任意两个点都有一条边 根据有无方向可分为 有向完全图和无向完全图 无向完全图有n个顶点,就有n(n-1)/2条边。 有向完全图有n个顶点,就有n(n-1)条边。
稀疏图
有很少边或弧的图(e<n log n)
稠密图
有较多边或弧的图
网
边或弧带权的图
邻接
有边/弧相连的两个顶点之间的关系。
存在(vⅰ, vj),则称vi和vj互为邻接点;(无向图)
存在<vi, vj>,则称vi邻接到vj, vj邻接于vi 。(有向图)
关联(依附)
边/弧与顶点之间的关系。
存在(vi, vj)/ <vi, vj>, 则称该边/弧关联于vi和vj
顶点的度
与该顶点相关联的边的数目,记为TD(v)
在有向图中, 顶点的度等于该顶点的入度与出度之和。
顶点 v 的入度是以 v 为终点的有向边的条数, 记作 ID(v)
顶点 v 的出度是以 v 为始点的有向边的条数, 记作OD(v)
问:当有向图中仅1个顶点的入度为0,其余顶点的入度均为1,此时是何形状?
答:是树!而且是一棵有向树!
路径
接续的边构成的顶点序列。
路径长度
路径上边或弧的数目/权值之和。
回路(环)
第一个顶点和最后一个顶点相同的路径。
简单路径
除路径起点和终点可以相同外,其余顶点均不相同的路径。
简单回路(简单环)
除路径起点和终点相同外,其余顶点均不相同的路径。
从0走到2,a中路径为0->1->3->2,不重复经过顶点,为简单路径;b中路径为0->1->3->0->1->2,经过的点有重复的,为非简单路径。
c中的路径为0->1->3->0,起点和终点相同,其他顶点均不相同,为回路。
连通图(强连通图)
在无(有)向图G=( V, {E} )中,若对任何两个顶点 v、u 都存在从v 到 u 的路径,则称G是连通图(强连通图)
权与网
图中边或弧所具有的相关数称为权。表明从一个顶点到另一个顶点的距离或耗费。带权的图称为网。
子图
设有两个图G=(V,{E})、G1=(V1,{E1}),若V1⊂ V,E1 ⊂ E ,则称 G1是G的子图。
例:(b)、(c) 是 (a) 的子图
连通分量(强连通分量)
无向图G 的极大连通子图称为G的连通分量。
极大连通子图意思是:该子图是 G 连通子图,将G 的任何不在该子图中的顶点加入,子图不再连通。
有向图G 的极大强连通子图称为G的强连通分量。
极大强连通子图意思是:该子图是G的强连通子图,将D的任何不在该子图中的顶点加入,子图不再是强连通的。
极小连通子图:该子图是G 的连通子图,在该子图中删除任何一条边,子图不再连通。
生成树:包含无向图G 所有顶点的极小连通子图。
生成森林:对非连通图,由各个连通分量的生成树的集合。
基本性质
图的抽象类型定义
基本操作
CreateGraph(&G,V,VR) 初始条件:V是图的顶点集,VR是图中弧的集合。 操作结果:按V和VR的定义构造图G。
DFSTraverse(G) 初始条件:图G存在。 操作结果:对图进行深度优先遍历。
BFSTraverse(G) 初始条件:图G存在。 操作结果:对图进行广度优先遍历。
顺序存储结构(数组(邻接矩阵)表示法)
- 建立一个顶点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间关系)。
- 设图 A = (V, E) 有 n 个顶点,则图的邻接矩阵是一个二维数 组 A.Edge[n][n],定义为:
无向图的邻接矩阵表示法
分析1:无向图的邻接矩阵是对称的;
分析2:顶点i 的度=第 i 行 (列) 中1 的个数;
特别:完全图的邻接矩阵中,对角元素为0,其余1。
有向图的邻接矩阵表示法
注:在有向图的邻接矩阵中, 第i行含义:以结点vi为尾的弧(即出度边); 第i列含义:以结点vi为头的弧(即入度边)。
分析1:有向图的邻接矩阵可能是不对称的。
分析2:顶点的出度=第i行元素之和 ,顶点的入度=第i列元素之和
顶点的度=第i行元素之和+第i列元素之和
网(有权图)的邻接矩阵表示法
邻接矩阵表示法的特点
优点
容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边、找顶点的邻接点等等。
缺点
n个顶点需要n*n个单元存储边;空间效率为O(n²)。 对稀疏图而言尤其浪费空间。
链式存储结构
邻接表(链式)表示法
v对每个顶点vi 建立一个单链表,把与vi有关联的边的信息链接起来,每个结点设为3个域
每个单链表有一个头结点(设为2个域),存vi信息
每个单链表的头结点另外用顺序存储结构存储
无向图的邻接表表示
注:邻接表不唯一,因各个边结点的链入顺序是任意的
==空间效率为O(n+2e)==
若是稀疏图(e<<n²),比邻接矩阵表示法O(n²)省空间
TD(Vi)=单链表中链接的结点个数
有向图的邻接表表示
==空间效率为O(n+e)==
出度:OD(Vi)=单链出边表中链接的结点数 入度:ID(Vi)=邻接点域为Vi的弧个数 度:TD(Vi) = OD( Vi ) + I D( Vi )
邻接表表示法的特点
优点
空间效率高,容易寻找顶点的邻接点
缺点
判断两顶点间是否有边或弧,需搜索两结点对应的单链表,没有邻接矩阵方便。
邻接矩阵与邻接表表示法的关系
- 联系:邻接表中每个链表对应于邻接矩阵中的一行,链表中结点个数等于一行中非零元素的个数。
- 区别:1. 对于任一确定的无向图,邻接矩阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)。2. 邻接矩阵的空间复杂度为O(n2),而邻接表的空间复杂度为O(n+e)
- ==用途:邻接矩阵多用于稠密图;而邻接表多用于稀疏图==