特点
一种更加复杂的非线性数据结构
名词解释
顶点(vertex): 图中的元素
边(edge): 图中的一个顶点可以与任意其他顶点建立连接关系
度(degree): 跟顶点相连接的边的条数
有向图: 边有方向的图
无向图: 边没有方向的图
入度(In-degree): 有多少条边指向这个顶点
出度(Out-degree): 有多少条边是以这个顶点为起点指向其他顶点
有向图
带权图(weighted graph): 在带权图中每条边都有一个权重(weight)
内存中存储图这种数据结构方法
1.邻接矩阵(Adjacency Matrix)存储
邻接矩阵的底层依赖一个二维数组
对于无向图来说,如果顶点i与顶点j之间有边,就将A[i][j]和A[j][i]标记为1;
对于有向图来说,如果有一条箭头从顶点i指向顶点j的边,就将A[i][j]标记为1;
同理,如果有一条箭头从顶点j指向顶点i的边,我们就将A[j][i]标记为1。
对于带权图,数组中就存储相应的权重
邻接矩阵存储方法
无向图中,adj[0][0]没边为0,adj[0][1]有边为1,adj[0][2]有边为1,adj[0][3]无边为0
总结
1.存储方式简单、直接,因为基于数组在获取两个顶点的关系非常高效
2.方便计算,可以将很多图的运算转换成矩阵之间的运算
比如求解最短路径问题的Floyd-Warshall算法,利用矩阵循环相乘若干次得到结果
3.比较浪费存储空间,特别针对稀疏图(Sparse Matrix): 顶点很多但每个顶点边不多
2.邻接表(Adjacency List)存储
每个顶点对应一条链表,链表中存储的是与这个顶点相连接的其他顶点
有向图: 每个顶点对应的链表里面,存储的是指向的顶点
无向图: 每个顶点对应的链表里面,存储的是跟这个顶点有边相连的顶点
有向邻接表
总结
邻接表存储起来比较节省空间,但使用比较耗时
链表的存储方式对缓存不友好,查询两个顶点之间的关系不高效
邻接表升级(链表数据结构替换)
1.换成平衡二叉查找树(红黑树),可以快速地查找两个顶点之间是否存在边了</