有人告诉我,如果图是稀疏的,我们将使用列表;如果图是密集的,将使用矩阵。对我来说,这只是一个原始定义。我没有看到更多。您能否澄清何时才是最自然的选择?
提前致谢!
有人告诉我,如果图是稀疏的,我们将使用列表;如果图是密集的,将使用矩阵。对我来说,这只是一个原始定义。我没有看到更多。您能否澄清何时才是最自然的选择?
提前致谢!
Answers:
首先请注意,稀疏意味着您只有很少的边,而密集意味着您有很多边,或者几乎是完整的图形。在一个完整的图中,您有边,其中是节点数。
现在,当我们使用矩阵表示时,我们分配矩阵来存储节点连接性信息,例如,如果节点和之间存在边,则,否则。
但是,如果我们使用邻接表,则我们有一个节点数组,每个节点都指向其邻接表,仅包含其相邻节点。
现在,如果图是稀疏的并且我们使用矩阵表示,那么大多数矩阵单元将保持未使用状态,这将导致内存浪费。因此,我们通常不将矩阵表示用于稀疏图。我们更喜欢邻接表。
但是,如果图是密集的,则边的数量接近(完整),如果图是用自环指向的,则边数接近。因此,与矩阵相比,使用邻接表没有任何优势。
就空间复杂度而言,
邻接矩阵:
邻接列表:
其中是节点数,是边数。
当图是无向树时,
邻接矩阵:
邻接列表:是(大于)O (n + n )O (n )n 2
有向图完成后,带有自循环,然后是
邻接矩阵:
邻接列表:是(无差值)O (n + n 2)O (n 2)
最后,当您使用矩阵实现时,检查两个节点之间是否存在边需要次,而使用邻接表时,可能要花费线性时间。n
通过提供一个简单的类比来回答。如果您必须存储6盎司的水,您(通常来说)会用5加仑的容器或8盎司的杯子来这样做吗?
现在,回到您的问题。如果矩阵的大部分为空,那么为什么要使用它呢?只需列出每个值即可。但是,如果您的清单确实很长,为什么不只使用矩阵来压缩它呢?
在这种情况下,列表与矩阵背后的原因实际上就是这么简单。
PS列表实际上只是一个单列矩阵!!!(试图向您展示决策/场景的任意性)
考虑具有节点和边的图。忽略低阶项,图的位矩阵使用位,无论有多少边。E N 2
但是,您实际上需要多少位?
假设边是独立的,则具有节点和边的图的数量为。存储此子集所需的最小位数为。ë
我们将不失一般性地假设,即存在一半或更少的边缘。如果不是这种情况,我们可以存储“非边缘”集。
如果,,那么矩阵表示是渐近最优的。如果,使用斯特林近似和一点点算术,我们发现:
如果您认为是可以表示节点索引的整数的大小,则最佳表示形式是节点ID的数组,即节点索引对的数组。
话虽如此,稀疏性的一个很好的度量是熵,它也是最优表示的每个边缘的位数。如果是存在边的概率,则熵为。对于,熵为2(即最佳表示中每个边两个位),并且图是密集的。如果熵显着大于2,尤其是如果它接近指针的大小,则该图是稀疏的。