图的表示法:邻接矩阵,邻接表,前向星
下面将介绍几种常用表示法:邻接矩阵,邻接表,前向星。以下图为例子:
邻接矩阵:
基础
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),其他都要遍历整条链。
总结:
稀疏图用链式前向星,稠密图用邻接矩阵;自己权衡下时空看着用。
除了邻接矩阵外的二维数组,都可以用结构体去保存。
一些参考: