Python中的图数据结构

2025 年 3 月 4 日 | 阅读 4 分钟

图是一种数据结构,用于表示一组称为节点(或顶点)的组件之间的链接或连接。这些链接称为边。图在计算机科学中广泛用于描述各种现实世界的问题,包括社交网络、计算机系统、交通系统等。

图的类型

1. 有向图与无向图

  • 有向图:在有向图中,每条边都有一个特定的方向。从节点 A 到节点 B 的边与从节点 B 到节点 A 的边不同。
  • 无向图:边没有方向。从节点 A 到节点 B 的边与从节点 B 到节点 A 的边相同。

2. 加权图与无权图

  • 加权图:边具有表示成本、距离和其他参数的权重。
  • 无权图:边没有权重,它们只是连接。

3. 有环图与无环图

  • 有环图包含至少一个环(即起点和终点相同的路径)。
  • 无环图不包含任何环。树是无环图的一种特殊类型。

Python 中的图表示

1. 邻接矩阵

  • 邻接矩阵是一个表示有限图的方阵。
  • 一个有 n 个节点的图的邻接矩阵的大小将是 n x n。
  • 矩阵 matrix[i][j] 中的每个单元格都表示一条边连接节点 i 和节点 j。
  • 如果图是无向的,则矩阵是对称的。
  • 如果图是加权的,则 matrix[i][j] 将保存边的权重,而不是仅为 1(表示存在)或 0(表示不存在)。

代码

输出

 
[[0, 0, 0, 1], [1, 1, 1, 0], [0, 1, 0, 0], [1, 0, 1, 1]]   

优点

  • 快速查找:检查两个节点之间是否存在边的 O(1) 时间复杂度。
  • 易于实现。

缺点

  • 空间浪费:节点多但边少的稀疏图需要 O(n²) 的空间,效率低下。

2. 邻接表

  • 邻接表可以由列表或字典组成,用于表示每个顶点的邻居(连接的节点)。
  • 这是一种表示稀疏图的高效策略。

使用列表的字典

代码

输出

 
{0: [1, 6], 1: [3, 5], 2: [9, 3], 3: [8, 2]}   

使用集合的字典(以避免重复边)

代码

输出

 
{0: {1, 6}, 1: {3, 5}, 2: {9, 3}, 3: {8, 2}}   

优点

  • 空间效率:它表示 O(V + E) 的空间,其中 V 表示顶点数,E 表示边数。
  • 更容易遍历与节点关联的所有边。

缺点

  • 检查两个节点之间的边可能需要 O(k) 的时间,其中 k 是邻居的数量。

图遍历算法

1. 深度优先搜索 (DFS)

  • DFS 可以递归实现,这是最佳策略。但是,对于非常深的图,这会导致堆栈溢出。
  • 迭代 DFS 可以实现为堆栈(LIFO 结构)来避免递归限制。

代码

输出

 
{'B', 'A', 'E', 'D', 'G', 'F', 'C'}   

在新的图中

  • 节点 'A' 连接到 'B' 和 'D'。
  • 节点 'B' 连接到 'A'、'C' 和 'E'。
  • 节点 'C' 连接到 'B' 和 'F'。
  • 节点 'D' 连接到 'A' 和 'G'。
  • 节点 'E' 连接到 'B' 和 'F'。
  • 节点 'F' 连接到 'C' 和 'E'。
  • 节点 'G' 连接到 'D'。

它将返回从节点 'A' 开始遍历的节点列表。

应用

  • 理解迷宫和谜题。
  • 检查图是否连通。
  • 在有向图中查找强连通分量。

2. 广度优先搜索 (BFS)

  • 最短路径:BFS 可用于查找无权图中最短路径。当 BFS 遍历图时,它确保访问的第一个节点遵循最短路径。

代码

输出

 
['A', 'B', 'C', 'F']   

在这个更新的图中

  • 节点 'A' 连接到 'B' 和 'D'。
  • 节点 'B' 连接到 'A'、'C' 和 'E'。
  • 节点 'C' 连接到 'B' 和 'F'。
  • 节点 'D' 连接到 'A' 和 'G'。
  • 节点 'E' 连接到 'B' 和 'H'。
  • 节点 'F' 连接到 'C'。
  • 节点 'G' 连接到 'D'。
  • 节点 'H' 连接到 'E' 和 'F'。

运行此代码后,输出将显示从节点 'A' 到节点 'F' 的最短路径,基于此新的图结构。

结论

Python 中,图数据结构提供了一种灵活且高效的方法来表示和操作对象之间的复杂关系。Python 提供了多种表示方法,包括邻接矩阵和邻接表,以及强大的遍历算法,如 BFS 和 DFS,以处理各种与图相关的任务。理解和实现 Python 中的图对于有效解决各种计算任务至关重要,包括建模网络、查找最短路径以及实现拓扑排序等高级操作。


下一个主题Griptape-for-python