前言
之前写的数据结构内容都删了,因为好多内容太水了,要不就是断更,虽然这篇也水 - -
图
图是一种多对多的数据结构,图由顶点(V)和边(E)组成。
图的分类
- 无向图 (v1,v2) 两个点互通, 边没有方向就是无向图
- 有向图(v1,v2) v1是起点,v2是终点,只能v1到v2, v2不能到v1的图就是有向图
- 完全图 边是n(n-1)/2,每对顶点之间有一条边
- 稀疏图 |E|<|V^2|的图
- 稠密图 |E| 接近 |V^2|的图
- 权重图(网络) 每条边上带有相关的权重的图
图的顶点有度
- 度: 所有和它连接的点个数之和
- 入度: 在有向图中,所有接入这个点的边数之和
- 出度: 在有向图中, 所有接出这个点的边数之和
创造图
- 邻接矩阵(邻接矩阵的优缺点) 适合完全图, 权重图
- 邻接表(邻接表的优缺点)适合稀疏图
邻接矩阵
在稠密图的时候,可以用邻接矩阵来表示,这样不会造成空间浪费,同时可以快速判断两个点之间是否有边连接,邻接矩阵的空间复杂度最坏情况是Θ(V^2)。
邻接表
邻接表表长是2|E|, 不管是有向图还是无向图空间复杂度都是Θ(V+E), 虽然空间复杂度比邻接矩阵小,但是查找效率没有邻接矩阵快。
图的遍历
- DFS(深度优先搜索) 和树的先序遍历差不多
- 使用栈和递归/回溯
- BFS(广度优先搜索) 树的层序遍历
- 使用队列
DFS 深度优先搜索
从图中某个点出发,接着找到下一个点,重复之前两个动作,直到图中所有的点都被访问过了,和树的先序遍历一样,如果某个点走不通了,就要回到之前的点,这个操作称为回溯。
BFS 广度优先搜索
假定一个图(V,E)和一个起点a,从起点a走完整个图,再走的过程中会产生一颗广度搜索树,源点作为根节点,配合队列实现,源点a进入队列,只要队列不为空,BFS就不会停止,出队的时候,取队头a,接着访问a的邻接顶点,重复之前的动作。