1.邻接表的定义
不同于邻接矩阵(二维数组存储),邻接表采用的顺序+链式存储实现的。
1.存储方式
- 顶点:使用结构体存储顶点,一个顶点包括顶点信息和指向第一条边或者弧的指针。
- 用邻接表存储图:使用结构体存储:顶点的一维数组,图的边和顶点的个数。
- 边和弧所对应的结点:使用结构体存储:边/弧指向的结点所对应的数组下标,指向下一条弧的指针,(如果是边权图则存在边权值的属性)。
邻接表法的存储方式和树的孩子表示法(顺序存储各个节点,每个结点中保存孩子链表头指针)其实是相同的。
2.空间复杂度
1.在无向图中
边的数量是冗余的,边界的数量是2E,整体空间复杂度为o(|V|+2|E|)
2.在有向图中
边结点的数量是|E|,整体空间复杂度为o(V+ E)。
3.计算邻接表顶点的度,入度,出度
1.在无向图中
- 度:遍历和顶点相关的边链表。
2.在有向图中
- 度等于入度加上出度。
- 度:遍历和顶点相关的边链表。
- 入度:统计从当前结点指向的链表
- 出度:将所有的结点遍历一遍,找到指向目标结点的边。
4.邻接表的表示
图的邻接表的表示方式并不唯一,而邻接矩阵表示方式:只要确定了顶点编号,图的邻接矩阵表示方式唯一。
5.邻接表和邻接矩阵的区别
空间复杂度 | 无向图O(V+2E); 有向图o(V+E) | o(V)2 |
适合用于 | 存储稀疏图 | 存储稠密图 |
表示方式 | 不唯一 | 唯一 |
计算度/出度/入度 | 计算有向图的度、入度不方便,其余很方便 | 必须遍历对应行或列 |
找相邻的边 | 找有向图的入边不方便,其余很方便 | 必须遍历对应行或列 |