数据结构 图有些想法
作者:互联网
图的定义与术语
1.图的基本定义
图是一种网状数据结构
有向图:有箭头边指向的图
无向图:无箭头边指向的图
2.图的基本术语:
完全图:分有向完全图和无向完全图,完全图就是所有节点与其他节点都有线连接。
稀疏图:在完全图里面,如果少了几条边,那么就是稀疏图
稠密图:不是稀疏图的就是稠密图
度:在无向图里面,一个节点有几条边度就是几。
入度与出度是在有向图里面讨论的。
对于有向图里面的某个结点A:A的入度就是指向A的箭头边,出度就是由A结点指向其他结点的边。如图:
A的入度:1
A的出度:2权:给图的边赋值,该值是自定义的,称为权。权可以表示很多信息,如:距离,耗费等信息。
网:带权的值称为赋权图或网。
路径:某个结点到另一个结点所经过的边是路径,路径的长度是经过边的数目。如果路径上每个顶点各不相同,就是简单路径。
回路:如果一条路径,其第一个顶点和最后一个顶点相同,该路径就是一个回路。如果除了第一个和最后一个顶点外,其余顶点均不重复出现的回路为简单回路。
连通:无向图中,有A,B两个顶点,它们之间有一条路径相同,那么A、B结点是连通的。
连通图:在无向图中,任意两点都是连通的,则该图为连通图。
强连通图:在有向图中,任意一对顶点(Vi, Vj),从Vi到Vj 或者 从Vj到Vi 都有路径,则称该图为强连通图。
图的存储结构
1.邻接矩阵表示法
也叫数组表示法。
① 对于无权的无向图(或有向图),邻接矩阵有如下性质:
如果
如图:
邻接矩阵是:
比如V1和V2两个结点相连,则在矩阵里面,[1, 2] = 1 ,[2, 1] = 1
( [i, j],1<= i <=5,1<= j <=5 )
该矩阵是对称矩阵。
对于有向图,求解过程差不多。
② 对于有权的有向图(或无向图),邻接矩阵有如下性质:
如果
如下有向图:
邻接矩阵为:
说明:如V1结点到V2结点,该路径权值为6。
而且对于有权有向图:横向看某一行,值不为无穷的个数就是该节点的出度数。纵向看某一列,值不为无穷的个数就是该节点的入度数。(无权有向图类似,判断一下矩阵里面数值为1或0的个数)
邻接矩阵特点:
- 对于结点多,边少的图,会邻接矩阵会浪费很多空间。对于对称的邻接矩阵,可以采用压缩存储法。
- 便于运算,只需要判断矩阵中的值可以判断结点是否相连接,还便于求解各个顶点的度。
2.邻接表表示法
基于邻接矩阵的缺陷提出的,高效存储图的关联信息的数据结构。
结构:
① 表头结点表
② 弧结点结构(边表)
③ 实例
- 无向图如下:
邻接表数据域里面的值是结点下标值(当然可以使其他值) - 有向图如下:
邻接表:
该有向图邻接表里面,数据域的值可以理解是字母顺序对应的数值(如A是1,B是2,当然也可以放其他值)
横向看每一行,结点数就是出度数,如A结点的出度数是2
如果按照之前的做法给邻接表的数据域赋值(按字母顺序顺序,如A是1,B是2),那么在整个邻接表中,值为1的结点个数就是A结点的入度数,A的入度数为1,依次类推。
如果要判断有向图,任意两点之间是否有边就比较麻烦。如果要求解第i个顶点的入度,就需要遍历整个邻接表。
所以就有了逆邻接表法解决该问题。
3.逆邻接表
对每个顶点Vi ,建立一个所有以顶点Vi为弧头的表,如图:
逆邻接表是:
对于A结点,横向看,只有一个节点,所以A结点的入度数是1。亦可知入度结点是D。
4.十字链表
有向图要构造邻接表和逆邻接表比较麻烦,所以结合这两张表的特点产生了十字链表。
十字链表弧结点结构
十字链表顶点结点结构
如下有向图:
十字链表如下:
标签:有些,有向图,路径,结点,想法,邻接矩阵,邻接,顶点,数据结构 来源: https://blog.51cto.com/u_14175378/2760045