何时邻接表或矩阵是更好的选择?


15

有人告诉我,如果图是稀疏的,我们将使用列表;如果图是密集的,将使用矩阵。对我来说,这只是一个原始定义。我没有看到更多。您能否澄清何时才是最自然的选择?

提前致谢!



那不是一个定义,主要是因为没有“稀疏”和“密集”的单一定义。此外,还有其他注意事项,例如您多久访问一次图形的哪些方面。
拉斐尔

@Raphael您可以进一步了解其他注意事项吗?
user21312

1
@ user21312,最大的区别是可迭代性与边缘访问。如果您经常需要遍历边缘,那么调整列表可能会更有用。如果您经常需要确定边缘是否存在或访问其权重(或其他信息),则矩阵可能会更好。
瑞安

为了您的目的,我们可能会不小心“稀疏”和“密集”的定义是什么。只需对要用于每种类型的数据结构的矩阵运算的时间复杂度进行建模,然后查看“密度的突破点”在哪里。我认为@ryan的第二个链接正在尝试做类似的事情
Apiwat Chantawibul

Answers:


17

首先请注意,稀疏意味着您只有很少的边,而密集意味着您有很多边,或者几乎是完整的图形。在一个完整的图中,您有边,其中是节点数。n(n1)/2n

现在,当我们使用矩阵表示时,我们分配矩阵来存储节点连接性信息,例如,如果节点和之间存在边,则,否则。 但是,如果我们使用邻接表,则我们有一个节点数组,每个节点都指向其邻接表,仅包含其相邻节点n×nM[i][j]=1ijM[i][j]=0

现在,如果图是稀疏的并且我们使用矩阵表示,那么大多数矩阵单元将保持未使用状态,这将导致内存浪费。因此,我们通常不将矩阵表示用于稀疏图。我们更喜欢邻接表。

但是,如果图是密集的,则边的数量接近(完整),如果图是用自环指向的,则边数接近。因此,与矩阵相比,使用邻接表没有任何优势。n(n1)/2n2

就空间复杂度而言,
邻接矩阵: 邻接列表: 其中是节点数,是边数。O(n2)
O(n+m)
nm

当图是无向树时,
邻接矩阵: 邻接列表:是(大于)O n + n O n n 2O(n2)
O(n+n)O(n)n2

有向图完成后,带有自循环,然后是
邻接矩阵: 邻接列表:是(无差值)O n + n 2O n 2O(n2)
O(n+n2)O(n2)

最后,当您使用矩阵实现时,检查两个节点之间是否存在边需要次,而使用邻接表时,可能要花费线性时间。nO(1)n


“使用邻接表时,可能需要线性时间”-鉴于您的邻接表(可能)缺少任何自然顺序,为什么它是列表而不是哈希集?
凯文

1
@Kevin然后将其称为“邻接哈希”而不是“列表”。也可能,为什么不呢?但是,如果您只是执行DFS或BFS或其他系统地扫描所有节点的过程,那么使用哈希覆盖列表的优势是什么?无论如何,您都将检查所有相邻节点。
fade2black

3
我要补充一点,在无权无向情况下,对于几乎完整的图,存储其补码(即稀疏图)可能更可行。因此,当存在大约一半的边缘时,矩阵很有用。
M. Winter

3

通过提供一个简单的类比来回答。如果您必须存储6盎司的水,您(通常来说)会用5加仑的容器或8盎司的杯子来这样做吗?

现在,回到您的问题。如果矩阵的大部分为空,那么为什么要使用它呢?只需列出每个值即可。但是,如果您的清单确实很长,为什么不只使用矩阵来压缩它呢?

在这种情况下,列表与矩阵背后的原因实际上就是这么简单。

PS列表实际上只是一个单列矩阵!!!(试图向您展示决策/场景的任意性)


2

考虑具有节点和边的图。忽略低阶项,图的位矩阵使用位,无论有多少边。E N 2NEN2

但是,您实际上需要多少位?

假设边是独立的,则具有节点和边的图的数量为。存储此子集所需的最小位数为。ëNE(N2E)log2(N2E)

我们将不失一般性地假设,即存在一半或更少的边缘。如果不是这种情况,我们可以存储“非边缘”集。EN22

如果,,那么矩阵表示是渐近最优的。如果,使用斯特林近似和一点点算术,我们发现:E=N22log2(N2E)=N2+o(N2)EN2

log2(N2E)
=log2(N2)!E!(N2E)!
=2Elog2N+O(low order terms)

如果您认为是可以表示节点索引的整数的大小,则最佳表示形式是节点ID的数组,即节点索引对的数组。log2N2E

话虽如此,稀疏性的一个很好的度量是熵,它也是最优表示的每个边缘的位数。如果是存在边的概率,则熵为。对于,熵为2(即最佳表示中每个边两个位),并且图是密集的。如果熵显着大于2,尤其是如果它接近指针的大小,则该图是稀疏的。p=EN2log2p(1p)p12

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.