邻接矩阵
数组实现的顺序存储,空间复杂度高,不适合存储稀疏图
👩💻 如何求顶点的度、入度、出度?
- 无向图
- 第i个结点的度 = 第i行(或第i列)的非零元素个数。
- 有向图
- 第i个结点的出度 = 第i行非零元素个数
- 第i个结点的入度 = 第i列非零元素个数
- 第i个结点的度=第i行、第i列的非零元素个数之和
- 邻接矩阵法求顶点的度/出度/入度的时间复杂度O(|V|)
邻接矩阵存储无向图的空间复杂度为O(|V|^2),适合存储稠密图
👌 设图G的邻接矩阵为A(矩阵元素为0/1),则An的元素An[i][j]等于由顶点i到顶点j的长度为n的路径的数目
邻接表
顺序+链式存储
- 图的邻接表表示方式并不唯一
- 只要确定了顶点编号,图的邻接矩阵表示方式唯一
十字链表
存储有向图
空间复杂度:O(|V|+|E|)
邻接多重表
存储无向图
- 空间复杂度:O(|V|+|E|)
- 删除边、删除结点等操作很方便
邻接表(找顶点的入边不方便) | 邻接矩阵(空间复杂度高) | 十字链表(有向图) | 邻接多重表(无向图) | |
---|---|---|---|---|
空间复杂度 | 无向图O(|V|+2|E|);有向图O(|V|+|E|) | O(|V|^2) | O(|V|+|E|) | O(|V|+|E|) |
适合用于 | 存储稀疏图 | 存储稠密图 | 只能存有向图 | 只能存无向图 |
表示方式 | 不唯一 | 唯一 | 不唯一 | 不唯一 |
计算度/出度/入度 | 计算有向图的入度、出度不方便,其余很方便 | 必须遍历对应行或列 | ||
找相邻的边 | 找有向图的入边不方便,其余很方便 | 必须遍历对应行或列 | 很方便 | 很方便 |
删除边或顶点 | 无向图中删除边或顶点都不方便 | 删除边很方便,删除顶点需要大量移动数据 | 很方便 | 很方便 |
图的基本操作
(时间复杂度) | 邻接矩阵 | 邻接表 |
---|---|---|
Adjacent(G,x,y) | 无向图/有向图:O(1) | 无向图/有向图:O(1)-O(|V|) |
Neighbors(G,x) | 无向图/有向图:O(|V|) | 无向图:O(1)-O(|V|);有向图:O(|E|) |
InsertVertex(G,x) | 无向图/有向图:O(1) | 无向图/有向图:O(1) |
DeleteVertex(G,x) | 无向图/有向图:O(|V|) | 无向图:O(1)-O(|E|);有向图:删出边:O(1)-O(|V|) 删入边:O(|E|) |
AddEdge(G,x,y) | 无向图/有向图:O(1) | 无向图/有向图:O(1) |
FirstNeighbor(G,x) | 无向图/有向图:O(1)-O(|V|) | 无向图:O(1);有向图:找出边邻接点:O(1) 找入边临界点:O(|E|)O(1)-O(|E|) |
NextNeighbor(G,x,y) | 无向图:O(1)-O(|V|) | 无向图:O(1) |
Get_edge_value(G,x,y) | 无向图/有向图:O(1) | 无向图/有向图:O(1)-O(|V|) |
Set_edge_value(G,x,y,v) | 无向图/有向图:O(1) | 无向图/有向图:O(1)-O(|V|) |