目录
邻接矩阵
邻接矩阵定义
所谓邻接矩阵存储是指用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息及各顶点之间的邻接关系。存储顶点之间的邻接关系的二维数组称为邻接矩阵。
对于带权图而言,若顶点Vi和Vj之间有边相连,则邻接矩阵中对应项存放着该边对应的权值。若顶点Vi和Vj不相连,则通常用无穷来表示这两个顶点之间不存在边。
用邻接矩阵法求顶点的度/出度/入度![](https://img-blog.csdnimg.cn/1ea6f2956b454edd9519338a68848169.png)
邻接矩阵法存储带权图(网)![](https://img-blog.csdnimg.cn/1b51a38f03f14f1da6338977e75f5409.png)
邻接矩阵法的性能分析
邻接矩阵法的性质
回顾整理邻接矩阵
- 在简单应用中,可直接用二维数组作为图的邻接矩阵。(顶点信息等均可省略)。
- 当邻接矩阵的元素仅表示相应边是否存在时。 EdgeType可采用值为0和1的枚举类型。
- 无向图的邻接矩阵是对称矩阵。对规模特大的邻接矩阵,可采用压缩存储
- 邻接矩阵表示法的空间复杂度为O(n^2),其中n为图的顶点数|V|。
注意:图的邻接矩阵存储表示法具有以下特点:
- 无向图的邻接矩阵一定是一个对称矩阵,并且唯一,因此在存储邻接矩阵时,只需要存储上(或下)三角矩阵的元素。
- 对于无向图,邻接矩阵的第i行(或者是第i列)非零元素(或非无穷元素)的个数正好是顶点i的度。
- 对于有向图邻接矩阵的第i行非零元素(或非无穷元素)的个数,正好是顶点i的出度OD(Vi)。第i列非零元素(或非无穷元素)的个数正好是顶点i的入度ID(Vi)。
- 用邻接矩阵存储图,很容易确定图中任意两个顶点之间是否有边相连,但是要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。
- 稠密图适合使用邻接矩阵的存储表示。
邻接表(顺序+链式存储)
邻接表的存储方式
当一个图文稀疏图时,使用邻接矩阵法显然要浪费大量的存储空间,而图的邻接表法结合了顺序存储和链式存储方法,大大减少了这种不必要的浪费。
所谓邻接表,是指对图G中的每个顶点Vi建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边,(对于有向图,则是以顶点Vi为尾的弧)。这个单链表就称为顶点Vi的边表。(对于有向图,则称为出边表)。边表的头指针和顶点的数据信息采用顺序存储,称为顶点表,所以在邻接表中存在两种结点:顶点表结点和边表结点。
类比树的孩子表示法
如何求顶点的度/入读/出度
对于无向图。直接遍历和某个顶点对应的边链表。有几个边结点,则这个顶点对应的度就是多少。遍历边链表,也可知道和这个顶点相连的所有边。
对于有向图,度=出度+入度。
找出度的方式:直接遍历对应顶点的边节点的链表。(因为有向图中链表是代表某个顶点发射出去的弧。
找入度的方法(即指向当前结点的弧)。就是把所有结点的边链表都遍历一遍,找到这个顶点在顶点集的序号和它的链表同样也是这个序号的结点
注意:
使用邻接表存储,每条边对应两份冗余信息,删除顶点、删除边等操作时间复杂度高。
对于邻接矩阵法来说,空间复杂度很高。O(|V|^2)
回顾重要知识点
十字链表
十字链表法的存储方式
十字链表法只存储有向图
十字链表法的性能分析
邻接多重表
邻接多重表只用来存储无向图
邻接多重表存储方式
回顾知识点