Bootstrap

数据结构编程实践20讲(Python版)—13图形数据结构

往期链接

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
;