概述
图也是节点之间通过指针连接的数据结构
另外图还有一些其他特征
- 有向和无向
- 有环和无环
图中的指针(通常在图中称为边)不仅仅是作为节点的一个属性,也用来表示节点之间的关系,换句话说在图中节点(vertex)和边(edge)同样重要。
树在可以认为是一个无向无环图,任意两点之间最多只能有一个路径。
另外还有一些图有关的术语
- 出度、入度 有向图中以当前顶点为起点和终点的边数目
图的表示
树通常使用链表表示,从根节点出发得到一个唯一的表示。
图中通常没有明确的唯一根节点,常用数组表示。
邻接矩阵
使用数组vertices存储顶点,使用数组edges存储边,其中edges[i][j] 代表节点 i + 1i+1 和 节点 j + 1j+1 之间是否有边。
比如
const vertices = [1, 2, 3, 4, 5]
const edges =
[[0, 1, 1, 1, 1],
[1, 0, 0, 1, 0],
[1, 0, 0, 0, 1],
[1, 1, 0, 0, 1],
[1, 0, 1, 1, 0]]
邻接表
使用数组vertices存储顶点,邻接表edges存储边,其中edges[i]表示与第i个顶点相邻的顶点集合。
比如
const vertices = [1, 2, 3, 4, 5]
const edges = [[1, 2, 3, 4],
[0, 3],
[0, 4],
[0, 1, 4],
[0, 2, 3]]
当然顶点集合也不一定是数组表示,也可以是链表。
两种方式的选择
邻接矩阵无论边数多少,空间复杂度都是n^2,而邻接表只需要保存实际存在的边,从这个角度稀疏图选择后者。
但邻接矩阵操作较为简单,而且可以保存权重方向等。
相关例题
图常考的包括搜索和拓扑排序,都会在下一章专题中详解。
其他的比如最短路