提示:图的存储结构是一篇非常重要的内容,大家一定要认真看哦。
图的存储结构
图的存储结构或表示方式比较多,在选择图的存储结构时,通常取决于具体的应用和所定义的操作。
下面介绍两种基本的存储结构,
即 邻接矩阵(顺序存储)
和 邻接表(顺序分配和链式分配相结合)。
邻接矩阵表示法
设图G=(V,E)是具有n个顶点的图,顶点序号依次为0,1,…,n-1,
则 定义一个大小为n的向量存储顶点的信息;(向量可以理解为数组)
定义一个具有以下性质的 n阶的方阵A(邻接矩阵)存储顶点间的相邻关系:
对于如下无向图G1的邻接矩阵
无向图邻接矩阵
从上面的存储表示可以看出,图的邻接矩阵表示法具有以下特点:
对于【无向图】,邻接矩阵的第i行(或第i列)非零元素的个数正好是第i个顶点的度TD(vi);
【无向图】的邻接矩阵一定是对称的 ,对于无向图,由于其对称性,只需存入上(或下)三角的元素,故只需n(n+1)/2个单元。
对于如下有向图G2的邻接矩阵
邻接矩阵表示法
从上面的存储表示可以看出,图的邻接矩阵表示法具有以下特点:
【有向图】的邻接矩阵不一定对称。
因此,用邻接矩阵来表示一个具有n个顶点的有向图时需要n的平方
个单元来存储邻接矩阵;
网的邻接矩阵表示法
若G是网,则:
Wij表示边上的权值;∞代表一个计算机允许的、大于所有边上权值的正整数;也就是说两个顶点之间的距离是无穷大。零代表是两个顶点之间距离为0。
对于如下网G4的邻接矩阵
邻接矩阵表示法 -----优点和缺点
邻接矩阵表示法优点: 很容易确定图中任意两个顶点间是否有边(或弧)相连。
邻接矩阵表示法缺点:要测试图中边(或弧)的数目时,则必须按行、列逐个检测。
这样所花的时间比较多,对于一个边(或弧)的数目很少的图是很不合算的。
邻接表
图的 邻接表是一种 顺序分配和 链式分配相结合的存储结构。
邻接表表示:对图中的每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的所有的边。
每个结点由两个域组成,其中邻接点域 :指示与顶点vi邻接的顶点在图中的序号, 链域:指示依附于顶点vi的下一条边或弧所对应的结点。如果用邻接表表示网 ,则还需要在结点中增加一个存放权值的域
邻接表特点
若无向图G有n个顶点,e条边,则邻接表需n个 表头结点和2e 个 表结点。
显然,对于边很少的图,用邻接表比用邻接矩阵要节省存储空间。
在无向图的邻接表中,顶点vi的度=第i个链表中表结点的个数。
在有向图的邻接链表中:
第i个链表中的表结点的个数=顶点vi的出度
若要求vi的入度,必须扫描整个邻接表,统计顶点域的值为i的表结点的数目。显然,这是很费时间的。(出度计算容易,入度计算难)
小结
掌握图的基本概念,例如完全图,顶点的度,连通和连通分量的概念等。
掌握图的两种基本的存储结构,邻接矩阵和邻接表表示。
对于有向图还要掌握逆邻接表表示。这里不多做讲解,有需要的同学可以自学。