📜  Graph的Adjacency List和Adjacency Matrix表示的比较(1)

📅  最后修改于: 2023-12-03 14:41:38.062000             🧑  作者: Mango

Graph的Adjacency List和Adjacency Matrix表示的比较

在图的数据结构中,有两种主要的表示方法:Adjacency List(邻接表)和Adjacency Matrix(邻接矩阵)。这两种方法在不同的场景下各有优劣,下面将进行比较。

Adjacency List

邻接表表示法是一种使用链表数据结构来记录所有顶点的相邻顶点,它通过向每个节点赋值一个列表,该列表包含了与此节点相连的所有节点。

优点
  • 可以灵活地对顶点和边进行修改
  • 对于稀疏矩阵(即大部分元素为0),空间占用较小
缺点
  • 查找任意两点间的关系时需要遍历链表,效率较低
  • 对于稠密矩阵(即大部分元素不为0),空间占用较大
示例代码
class Graph:
    def __init__(self):
        self.adj_list = {}

    def add_node(self, node):
        self.adj_list[node] = []

    def add_edge(self, node1, node2):
        self.adj_list[node1].append(node2)
        self.adj_list[node2].append(node1)
Adjacency Matrix

邻接矩阵表示法是一种使用二维数组来记录图上各个节点之间的关系,其中每个元素代表一个节点之间的边或权重。

优点
  • 查找任意两点间的关系时速度较快
  • 对于稠密矩阵(即大部分元素不为0),空间占用较小
缺点
  • 对于稀疏矩阵(即大部分元素为0),空间占用较大
  • 对于新增、删除节点和边时,需要重新创建整个矩阵
示例代码
class Graph:
    def __init__(self, num_vertices):
        self.adj_matrix = [[0]*num_vertices for _ in range(num_vertices)]
        self.num_vertices = num_vertices

    def add_edge(self, v1, v2, weight=1):
        self.adj_matrix[v1][v2] = weight
        self.adj_matrix[v2][v1] = weight

    def remove_edge(self, v1, v2):
        self.adj_matrix[v1][v2] = 0
        self.adj_matrix[v2][v1] = 0
总结

Adjacency List和Adjacency Matrix各有其适用场景,需要根据具体情况进行选择。邻接表适用于稀疏矩阵,对于新增、删除节点和边具有灵活性;邻接矩阵适用于稠密矩阵,对于查找任意两点间的关系速度较快。