图的两种存储方式:邻接表、邻接矩阵

图的两种存储方式:邻接表、邻接矩阵

图的存储结构主要分两种,一种是邻接矩阵,一种是邻接表

1.邻接矩阵

图的邻接矩阵存储方式是用两个数组来表示图:一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中的边或弧的信息。

设图G有n个顶点,则邻接矩阵是一个 n ∗ n n*n nn 的方阵,定义为:

a r g [ i ] [ j ] = { 1 , 若 ( v i , v j ) ∈ E < v i , v j > ∈ E 0 , 若 ( v i , v j ) ∉ E < v i , v j > ∉ E arg[i][j]=\left\{ \begin{aligned} 1 ,& 若(v_i,v_j) \in E <v_i,v_j> \in E\\ 0 ,&若(v_i,v_j) \notin E <v_i,v_j> \notin E\\ \end{aligned} \right. arg[i][j]={10(vi,vj)E<vi,vj>E(vi,vj)/E<vi,vj>/E

看一个实例,下图左就是一个无向图。

从上面可以看出,无向图的边数组是一个对称矩阵。所谓对称矩阵就是 n n n 阶矩阵的元满足 a i j = a j i a_{ij} = a_{ji} aij=aji。即从矩阵的左上角到右下角的主对角线为轴,右上角的元和左下角相对应的元全都是相等的。从这个矩阵中,很容易知道图中的信息。

  1. 要判断任意两顶点是否有边无边就很容易了;
  2. 要知道某个顶点的度,其实就是这个顶点 v i v_i vi 在邻接矩阵中第 i i i 行或(第 i i i 列)的元素之和
  3. 求顶点 v i v_i vi 的所有邻接点就是将矩阵中第i行元素扫描一遍 a r c [ i ] [ j ] arc[i][j] arc[i][j]为1就是邻接点;

有向图讲究入度和出度,顶点 v i v_i vi 的入度为1,正好是第 i i i 列各数之和。顶点 v i v_i vi 的出度为2,即第 i i i 行的各数之和。

若G是网图,有 n n n 个顶点,则邻接矩阵是一个 n ∗ n n*n nn的方阵,定义为:
a r g [ i ] [ j ] = { W i j , 若 ( v i , v j ) ∈ E < v i , v j > ∈ E 0 , 若 i = j ∞ , 反 arg[i][j]=\left\{ \begin{aligned} W_{ij} ,&若(v_i,v_j) \in E <v_i,v_j> \in E\\ 0,&若 i=j\\ \infty,&反 \end{aligned} \right. arg[i][j]=Wij0(vi,vj)E<vi,vj>Ei=j

2.邻接表
邻接矩阵是不错的一种图存储结构,但是,对于边数相对顶点较少的图,这种结构存在对存储空间的极大浪费。因此,找到一种数组与链表相结合的存储方法称为邻接表。

邻接表的处理方法是这样的:

  • 图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过,数组可以较容易的读取顶点的信息,更加方便;
  • 图中每个顶点 v i v_i vi 的所有邻接点构成一个线性表,由于邻接点的个数不定,所以,用单链表存储,无向图称为顶点 v i v_i vi 的边表,有向图则称为顶点 v i v_i vi 作为弧尾的出边表。

例如,下图就是一个无向图的邻接表的结构。

从图中可以看出,顶点表的各个结点由datafirst_edge两个域表示,data是数据域,存储顶点的信息first_edge是指针域,指向边表的第一个结点,即此顶点的第一个邻接点。边表结点由adjvexnext两个域组成。adjvex邻接点域,存储某顶点的邻接点在顶点表中的下标next则存储指向边表中下一个结点的指针

对于带权值的网图,可以在边表结点定义中再增加一个 weigt 的数据域,存储权值信息即可。如下图所示。
)

3.两者区别

  1. 对于一个具有 n n n 个顶点 e e e 条边的无向图:它的邻接表表示有 n n n个顶点表结点 2 e e e 个边表结点;
  2. 对于一个具有 n n n个顶点 e e e条边的有向图:它的邻接表表示有 n n n个顶点表结点 e e e个边表结点;
  3. 如果图中边的数目远远小于 n 2 n^2 n2 称作稀疏图,这是用邻接表表示比用邻接矩阵表示节省空间;
  4. 如果图中边的数目接近于 n 2 n^2 n2,对于无向图接近于 n ∗ ( n − 1 ) n*(n-1) n(n1) 称作稠密图,考虑到邻接表中要附加链域,采用邻接矩阵表示法为宜。
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值