邻接矩阵法和邻接表法(图的存储)

1.邻接矩阵法

(1)邻接矩阵法定义

通过一个二维矩阵来表示图中各个顶点之间的连接关系。邻接矩阵中的行和列分别代表图中的顶点,而矩阵中的元素则表示对应顶点之间是否存在边。表示方式唯一

c 复制代码
typedef struct{
	ElementType vertex[maxVertexNum];// 顶点表
	ElementType edge[maxVertexNum][maxVertexNum];// 邻接矩阵(边表)
	int vertexNum,edgeNum;// 顶点数,边数
}adjacencyMatrix;

邻接矩阵法的空间复杂度为 O ( ∣ v ∣ 2 ) O(|v|^2) O(∣v∣2) ,适合用于稠密图。无向图的邻接矩阵是对称矩阵,可压缩存储

(2)计算顶点的度、入度、出度

类型 计算方式
度(无向图) 顶点在邻接矩阵中对应行/列中表示边存在的元素个数
入度(有向图) 顶点在邻接矩阵中对应列中表示边存在的元素个数
出度(有向图) 顶点在邻接矩阵中对应行中表示边存在的元素个数

注:邻接举证法求顶点的度/入度/出度的时间复杂度为 O ( ∣ v ∣ ) O(|v|) O(∣v∣)

(3)对称矩阵的压缩存储

策略:用一维数组存储主对角线和上(下)三角区元素

公式:i代表矩阵的行( i > = 1 i>=1 i>=1),j代表矩阵的列( j > = 1 j>=1 j>=1),k代表数组下标( k > = 0 k>=0 k>=0)

k = { i ( i − 1 ) 2 + j − 1 , i > = j j ( j − 1 ) 2 + i − 1 , j > = i k = \begin{cases} \frac{i(i-1)}{2}+j-1, & \text{i\>=j} \\ \frac{j(j-1)}{2}+i-1, & \text{j\>=i} \\ \end{cases} k={2i(i−1)+j−1,2j(j−1)+i−1,i>=jj>=i

(4)邻接矩阵法的性质

设图G的邻接矩阵为A(矩阵元素为0或1),则 A n A^n An的元素 A n [ i ] [ j ] A^n[i][j] An[i][j]等于由顶点i到顶点j的长度为n的路径数目

2.邻接表法

(1)邻接表法定义

通过链表的方式存储每个顶点所连接的边和相应的顶点。对于图中的每个顶点,邻接表都为其创建一个链表,链表中存储了与该顶点相邻的其他顶点。表示方式不唯一

c 复制代码
// 边
typedef struct EdgeNode{
	int vertexIndex;// 指向邻接表中哪个结点
	struct EdgeNode *next;// 指向下一条边的指针
}EdgeNode;
// 顶点
typedef struct vertexNode{
	VertexType data;// 顶点信息
	EdgeNode* first;// 指向第一条边的指针
}AdjacencyList[maxVertexNum];
// 邻接表存储的图
typedef struct{
	AdjacencyList vertexs;
	int vertexNum,edgeNum;
}AdjacencyGraph;

无向图中邻接表法的空间复杂度为 O ( ∣ V ∣ + 2 ∣ E ∣ ) O(|V|+2|E|) O(∣V∣+2∣E∣),有向图中邻接表法的空间复杂度为 O ( ∣ V ∣ + ∣ E ∣ ) O(|V|+|E|) O(∣V∣+∣E∣)

(2)计算顶点的度、入度、出度

类型 计算方式
度(无向图) 顶点的边链表的结点数目
入度(有向图) 遍历每个顶点的边链表,计算出指向该结点的边结点之和
出度(有向图) 顶点的边链表的结点数目
相关推荐
亮亮爱刷题9 天前
飞往大厂梦之算法提升-7
数据结构·算法·leetcode·动态规划
_周游9 天前
【数据结构】_二叉树OJ第二弹(返回数组的遍历专题)
数据结构·算法
双叶8369 天前
(C语言)Map数组的实现(数据结构)(链表)(指针)
c语言·数据结构·c++·算法·链表·哈希算法
zmuy9 天前
124. 二叉树中的最大路径和
数据结构·算法·leetcode
转码的小石9 天前
Java面试复习指南:并发编程、JVM、Spring框架、数据结构与算法、Java 8新特性
java·jvm·数据结构·spring·面试·并发编程·java 8
chao_7899 天前
滑动窗口题解——找到字符串中所有字母异位词【LeetCode】
数据结构·算法·leetcode
LZA1859 天前
数据结构day1
数据结构
稳兽龙9 天前
P3258 [JLOI2014] 松鼠的新家
数据结构·c++·算法·深度优先·lca
江边垂钓者9 天前
进程间通信、线程间通信
java·网络·数据结构
XiaoCCCcCCccCcccC9 天前
C语言数组介绍 -- 一维数组和二维数组的创建、初始化、下标、遍历、存储,C99 变长数组
c语言·数据结构·算法