本文目录
往期链接
01 数组 | 02 链表 | 03 栈 | 04 队列 | 05 二叉树 | 06 二叉搜索树 | 07 AVL树 | 08 红黑树 | 09 B树 | 10 B+树 |
---|
11 线段树 | 12 树状数组 |
---|
13 图形数据结构(Graph)
S1 说明
图形数据结构是一种重要的数据结构,用于表示一组对象(称为顶点或节点)之间的关系(称为边)。图的应用广泛,常见于社交网络、网络路由、推荐系统等领域。
图的基本概念
- 顶点(Vertex):
图中的基本单位,表示一个对象。 - 边(Edge):
连接两个顶点的线,表示它们之间的关系。 - 有向图与无向图:
- 有向图(Directed Graph):边有方向,从一个顶点指向另一个顶点。
- 无向图(Undirected Graph):边没有方向,连接的两个顶点是对称的。
- 加权图与非加权图:
- 加权图(Weighted Graph):边有权重,表示连接两个顶点的代价或距离。
- 非加权图(Unweighted Graph):边没有权重,所有边被视为相同。
图的基本特征
1. 连通性
- 连通图:图中任意两个顶点之间都有路径相连。
- 非连通图:至少存在一个顶点无法通过路径到达其他顶点。
2. 度
- 顶点度(Degree):与一个顶点相连的边的数量。
- 入度(Indegree):有向图中指向某个顶点的边的数量。
- 出度(Outdegree):有向图中从某个顶点出发的边的数量。
3. 子图
- 子图:由图的部分顶点和边组成的图,可以是有向的或无向的。
4. 环与无环
- 环(Cycle):路径的开始和结束顶点相同,且至少包含一个边。
- 无环图(Acyclic Graph):不包含任何环的图。常见的无环图有树(Tree)。
5. 图的类型
- 完全图(Complete Graph):每一对不同的顶点都有一条边相连。
- 平面图(Planar Graph):可以在平面上绘制而不交叉的图。
6. 图的连通分支
- 连通分支:在非连通图中,每个连通子图称为一个连通分支。
7. 图的权重
- 权重:边的值或成本,通常用于加权图,表示连接两个顶点的代价或距离。
8. 拓扑排序
- 对于有向无环图(DAG),可以对顶点进行线性排序,使得每条边的起点在终点之前。
9. 连通性指标
- 聚类系数(Clustering Coefficient):衡量图中顶点聚集程度的指标。
- 直径(Diameter):图中最长的最短路径的长度。
10. 图的同构性
- 同构图(Isomorphic Graphs):两个图的结构相同,即存在一一对应的顶点关系,使得对应的边也相连。
图的基本操作
- 添加顶点:
在图中添加新的顶点。 - 添加边:
在两个顶点之间添加边。 - 删除顶点:
从图中删除一个顶点及其相关边。 - 删除边:
从图中删除两个顶点之间的边。 - 查找顶点
检查图中是否存在某个顶点 - 查找边
检查两个顶点之间是否存在边 - 遍历图
使用深度优先搜索(DFS)或广度优先搜索(BFS)遍历图 - 获取邻接顶点
获取与指定顶点相连的所有顶点。 - 计算图的度
计算一个顶点的度(与之相连的边的数量)
S2 典型图数据结构示例
邻接矩阵(Adjacency Matrix)
# 示例:邻接矩阵
V = 4 # 顶点数量
adj_matrix = [[0] * V for _ in range(V)]
# 添加边
adj_matrix[0][1] = 1 # 从顶点0到顶点1的边
adj_matrix[1][0] = 1 # 从顶点1到顶点0的边(无向图)
邻接表(Adjacency List)
# 示例:邻接表
adj_list = {
0: [1],
1: [0, 2],
2: [1],
3: []
}
边列表(Edge List)
# 示例:边列表
edge_list = [
(0, 1),
(1, 2),
(2, 1