Graph邻接矩阵

在本教程中,您将了解什么是邻接矩阵。 此外,您还可以在 Python 中找到邻接矩阵的工作示例。

邻接矩阵是一种将图表示为布尔矩阵(0 和 1)的方法。 有限图可以在计算机上以方阵的形式表示,其中矩阵的布尔值表示两个顶点之间是否存在直接路径。

例如,我们有下面的图表。

Graph邻接矩阵_第1张图片

我们可以用矩阵形式表示这个图,如下所示。

Graph邻接矩阵_第2张图片

上表/矩阵中的每个单元格都表示为 A i j A_{ij} Aij,其中 i i i j j j 是顶点。 A i j A_{ij} Aij 的值是 1 还是 0,取决于是否存在从顶点 i i i 到顶点 j j j 的边。

如果存在从 i i i j j j 的路径,则 A i j A_{ij} Aij 的值为 1,否则为 0。例如,从顶点 1 到顶点 2 有一条路径,因此 A 12 A_{12} A12 为 1,并且没有从顶点 1 到 3 的路径, 所以 A 13 A_{13} A13 为 0。

在无向图的情况下,矩阵关于对角线对称,因为每条边 ( i , j ) (i,j) (i,j),也有一条边 ( j , i ) (j,i) (j,i)

邻接矩阵的优点

  • 添加边、删除边以及检查是否存在从顶点 i i i 到顶点 j j j 的边等基本操作是非常省时的恒定时间操作。
  • 如果图密集且边数很大,则应首选邻接矩阵。 即使图和邻接矩阵是稀疏的,我们也可以使用稀疏矩阵的数据结构来表示它。
  • 然而,最大的优势来自于矩阵的使用。 硬件的最新进展使我们能够在 GPU 上执行甚至昂贵的矩阵运算。
  • 通过对邻接矩阵执行操作,我们可以深入了解图的性质及其顶点之间的关系。

邻接矩阵的缺点

  • 邻接矩阵的 V × V V \times V V×V 空间要求使其成为内存占用者。 图通常没有太多的连接,这就是为什么邻接表是大多数任务的更好选择的主要原因。
  • 虽然基本操作很简单,但在使用邻接矩阵表示时,像 inEdgesoutEdges 这样的操作代价高昂。

Python中的邻接矩阵代码

# Adjacency Matrix representation in Python


class Graph(object):

    # Initialize the matrix
    def __init__(self, size):
        self.adjMatrix = []
        for i in range(size):
            self.adjMatrix.append([0 for i in range(size)])
        self.size = size

    # Add edges
    def add_edge(self, v1, v2):
        if v1 == v2:
            print("Same vertex %d and %d" % (v1, v2))
        self.adjMatrix[v1][v2] = 1
        self.adjMatrix[v2][v1] = 1

    # Remove edges
    def remove_edge(self, v1, v2):
        if self.adjMatrix[v1][v2] == 0:
            print("No edge between %d and %d" % (v1, v2))
            return
        self.adjMatrix[v1][v2] = 0
        self.adjMatrix[v2][v1] = 0

    def __len__(self):
        return self.size

    # Print the matrix
    def print_matrix(self):
        for row in self.adjMatrix:
            for val in row:
                print('{:4}'.format(val)),
            print


def main():
    g = Graph(5)
    g.add_edge(0, 1)
    g.add_edge(0, 2)
    g.add_edge(1, 2)
    g.add_edge(2, 0)
    g.add_edge(2, 3)

    g.print_matrix()


if __name__ == '__main__':
    main()

邻接矩阵应用

  • 在网络中创建路由表
  • 导航任务

参考资源

[1] Adjacency Matrix

你可能感兴趣的:(知识图谱,图论,算法)