邻接表和邻接矩阵是在内存中表示图形的两种常用方式。在这两者之间做出决定时,您需要做出的第一个决定是您想要优化的内容。例如,如果您需要获取顶点的邻居列表,则邻接列表非常快。另一方面,如果您正在对边是否存在进行大量测试或有马尔可夫链的图形表示,那么您可能更喜欢邻接矩阵。
您需要考虑的下一个问题是您需要多少才能适应内存。在大多数情况下,图中边的数量远小于可能边的总数,邻接列表会更有效,因为您只需要存储实际存在的边。一个快乐的媒介是以压缩稀疏行格式表示邻接矩阵,其中您保留从左上角到右下角的非零条目的向量,相应的向量指示可以在哪些列中找到非零条目,以及第三个向量,指示列条目向量中每一行的开始。
[[0.0, 0.0, 0.3, 0.1]
[0.1, 0.0, 0.0, 0.0]
[0.0, 0.0, 0.0, 0.0]
[0.5, 0.2, 0.0, 0.3]]
可以表示为:
vals: [0.3, 0.1, 0.1, 0.5, 0.2, 0.3]
cols: [2, 3, 0, 0, 1, 4]
rows: [0, 2, null, 4]
压缩稀疏行实际上是一个邻接列表(列索引的功能相同),但该格式更适合矩阵运算。