用邻接矩阵实现图结构:数据存储的小技巧

在做数据备份系统时,偶尔会遇到需要记录节点之间关系的场景。比如,公司内部服务器之间的连接状态,或者用户文件在不同存储节点间的同步路径。这时候,图结构就派上用场了。

什么是邻接矩阵

图可以用多种方式表示,邻接矩阵是其中一种直观的方式。它用一个二维数组来表示图中各个顶点之间的连接关系。如果图中有 n 个顶点,那就创建一个 n×n 的矩阵。矩阵中的每个元素 matrix[i][j] 表示从顶点 i 到顶点 j 是否有边存在。如果有边,值为 1(或边的权重),否则为 0。

比如,假设有三台服务器 A、B、C,A 和 B 相连,B 和 C 相连,但 A 和 C 没有直接连接。那么邻接矩阵看起来就像这样:

    A  B  C
A   0  1  0
B   1  0  1
C   0  1  0

这种结构特别适合顶点数量不多但连接频繁的情况。虽然它在稀疏图中会浪费一些空间,但在判断两个节点是否相连时,速度非常快,只需要 O(1) 时间。

代码实现示例

下面是一个简单的 Python 实现,用来管理备份节点之间的连接关系:

class Graph:
    def __init__(self, n):
        self.n = n  # 节点数量
        self.matrix = [[0] * n for _ in range(n)]

    def add_edge(self, i, j):
        self.matrix[i][j] = 1
        self.matrix[j][i] = 1  # 无向图

    def has_edge(self, i, j):
        return self.matrix[i][j] == 1

    def remove_edge(self, i, j):
        self.matrix[i][j] = 0
        self.matrix[j][i] = 0

假设我们把每台备份服务器编号为 0、1、2……就可以用这个类来维护它们之间的通信链路。添加一条连接、删除链路,或者检查是否已连通,操作都很直接。

在数据备份中的实际用途

比如某次灾备演练中,我们需要快速判断某台服务器能否通过其他节点访问到主存储。用邻接矩阵构建网络拓扑后,配合深度优先搜索(DFS)或广度优先搜索(BFS),能迅速得出可达性结果。

虽然现代分布式系统更多使用邻接表或图数据库,但在小型系统或配置固定的环境中,邻接矩阵因其简洁和高效,依然是个实用的选择。尤其在写脚本做临时分析时,几行代码就能搭出模型,省事又清楚。