O(V+E) 空间复杂度是什么意思?

pho*_*nix 1 algorithm graph-algorithm

时间复杂度,O(v+e)很明显它类似于在程序中单独运行的 2 个循环(e 次和 v 次)。

但是,当同样涉及空间复杂性时,我感到困惑。

是不是先分配O(v)空间,然后释放空间,再分配O(e)空间?

谢谢!

Mic*_*lle 5

当您处理时间复杂度时,加法 ( O(v+e)) 意味着两件事按顺序发生。当你转向空间复杂性时,+符号应该在空间上下文中使用,而不是在时间上下文中。

O(v+e)空间相当于使用O(v)+O(e)空间。本质上(我假设您在这里处理图形),这意味着您为每个顶点使用了一些存储空间,为每个边使用了一些空间(也许您有 aList<Vertex>和 a List<Edge>,或者其他东西)-很可能全部在同时。

在您分配O(v)内存、释放内存然后分配O(e)内存的示例中,您O(max(v,e))随时都在使用空间。

编辑:正如 G. Bach 指出的那样,O(v+e)将始终等同于O(max(v,e)). 我认为在某些情况下,就清晰度而言,其中一个更合适(一个或另一个将更好地表达实际使用的空间/时间),但这是主观的。如果这是针对课堂的,您的教师可能更喜欢一种符号而不是另一种 - 从课堂笔记中应该很明显,或者您可以询问。但简而言之,O(v+e)适用于已描述的两种情况。

  • 另一种更清晰地可视化这一点的算法是使用 BFS 或 DFS 找到图形的连接组件。这也有 O(|V| + |E|) 时间复杂度,对于边比节点少的图,我们得到 |V| &gt; |E| 所以 O(|V| + |E|) = O(|V|),但是对于边多于节点的图,这给了我们 O(|V| + |E|) = O(|E|)。 (2认同)