【问题标题】:Worst case memory for Graph data structureGraph 数据结构的最坏情况内存
【发布时间】:2013-06-19 07:04:45
【问题描述】:

我可以在很多书中看到,图形的最坏情况下的内存需求是 O(V)。但是,如果我没记错的话,图通常表示为邻接矩阵,而不是通过创建节点(如链表/树)。因此,对于包含 5 个顶点的图,我需要 5x5 矩阵,即 O(V^2)。他们为什么说它是O(V)?

我是否在某处遗漏了什么?对不起,如果这个问题太天真了。

【问题讨论】:

  • 您能否准确引用其中一本的书?
  • @Jason:看看著名的 CLRS,他们也提到了 O(V)。
  • 可以用链表表示。
  • @shar:再次,请提供准确的报价。
  • 查看这个 SO 问题 *.com/questions/3287003/…

标签: algorithm data-structures graph


【解决方案1】:

表示图形的三种主要方式是:

  • 邻接矩阵 - Θ(|V|²) 空间。
  • 邻接表 - Θ(|V| + |E|) 空间。
  • 节点对象/结构的集合与彼此的指针 - 这基本上只是表示邻接列表的另一种方式。 Θ(|V| + |E|)。 (请记住,指针也需要内存。)

由于我们谈论的是最坏的情况,所有这些都减少到 Θ(|V|²),因为这是图中的最大边数。

我猜你误读了这本书。他们可能不是在谈论存储图形结构本身所需的空间,而是一些图形算法所需的额外空间量。

【讨论】:

  • 这是 CLRS 在书中提到的,至少在第 3 版中。
【解决方案2】:

如果您说的是真的,那么他们可能指的是 其他 表示图的方法,而不是使用邻接矩阵,并且可能正在做出边密度假设。一种方法是,对于每个顶点,只需存储指向其邻居的指针/引用列表(称为邻接列表)。这将是O(|V| + |E|)如果我们假设|E| ~ |V|,这是我们有时会看到的假设,那么我们就有O(|V|) 空间。但请注意,在最坏的情况下,|E| ~ |V|^2,因此即使这种表示图形的方法在最坏的情况下也是O(|V|^2)

看,这很简单;在最坏的情况下|E| ~ |V|^2 是无法回避的事实。一般来说,E 的表示不可能在最坏的情况下不是O(|V|^2)

但是,最好有一个准确的报价。这是重要的。我们不想发现自己撕毁了您对正确陈述的误解。

【讨论】:

  • 由于 OP 询问 最坏情况 内存使用情况,我认为 |E| ~ |V| 在这种情况下不是一个安全的假设。
  • 我没有做出这样的假设。我说过,OP 对这本书的理解可能是正确的一种方式是如果这本书做出了这样的假设。我对 OP 很慷慨,因为很明显,总的来说,在没有某种假设的情况下,OP 被误解了。很明显,只有两种可能性:要么是 OP 误解了这本书,要么这本书确实有某种假设使该陈述成立。