首页 > 技术文章 > 图的表示法:邻接矩阵,邻接表,前向星

willaty 2018-01-05 00:14 原文

下面将介绍几种常用表示法:邻接矩阵,邻接表,前向星。以下图为例子:

邻接矩阵:

基础

0 1 1

0 0 1

0 0 0

可以用二维矩阵实现,意义:

第一行表示第一点,第一行也表示第一点,没有连接,为0;

第一行第二列,表示第一点到第二点,有连接,为1;

第三行,第三点,未连接到任何点,全是0;

扩展:

如果有权重,可以用权重代替1;也可以用INT32_MAX代替0。

如果是无向图,其实是:1和2有连接,2和1也有连接。矩阵等于其转秩。

邻接表:

基础:

1 -> 2 -> 3

2 -> 3

3

可用一个数组,储存一个链表,链表保存与这个节点连接的所有节点。

扩展:

有向图,链表只连接指出去的;无向图,凡是连接都加入链表。

前向星(forward star):

也称星型表示法,也是用数组储存。

基础:

用一个二维数组储存,起点,终点(需要权重也可以加),每个节点的边是连续的

1 1 2

2 3 3

第一列表示起点是1终点是2;第二列表示起点是1终点是3。

用另一个数组储存每个点的开始索引(这里数组从1开始):

1 3

第一个元素表示第一个节点从1开始索引,第二个元素表示2从3开始索引。

链式前向星:

前向星的扩展,实际相当于邻接表的数组表示。实现简单!

基础:

用上面的图展示:

用一个二维数组储存边的关系,

2    3   3

60 80 70

0    2   0

第一行表示终点,第二行表示权值,第三行表示下一条边的起始位置。

另外用一个数组表示每个点的起始边(下面数组从1开始):

2 3 0

零表示没有起始边,2表示第一个点从二维数组的第二列还是,3表示第二个点从第三列开始。

效率:

空间效率:

邻接矩阵简单直接,但对于稀疏图比较浪费空间,复杂度为n^2,n为节点数;

邻接表节省空间,但如果要确定某条边是否存在,需要遍历整个一条链,复杂度为n+m,m表示边的数量;但要考虑链表中指针的额外空间。

前向星,访问快,也不能O(1)判断某条边是否存在,复杂度n+m。

链式前向星,类似邻接表,用数组储存。

时间效率:

建表效率:

邻接矩阵O(m)

邻接表O(m)

前向星O(mlogm),最后需要排序

链式前向星O(m)

 查找边的效率:

除了邻接矩阵是O(1),其他都要遍历整条链。

总结:

稀疏图用链式前向星,稠密图用邻接矩阵;自己权衡下时空看着用。

除了邻接矩阵外的二维数组,都可以用结构体去保存。

 

一些参考:

http://blog.csdn.net/woaidapaopao/article/details/51732947

https://www.cnblogs.com/Tovi/p/6194786.html

推荐阅读