【发布时间】:2016-12-10 16:42:34
【问题描述】:
如果我的想法是错误的,请纠正我。我认为 BigO(V + E) = BigO(V^2)。
以下是我的想法:
完整图中的边 = n*(n-1)/2。
从 E 和 V 切换到 n,因为这样想更容易。
E = n*(n-1)/2
V = n
BigO(V + E) => BigO(n + n*(n-1)/2) => BigO(n^2)
将 n 切换回 V。
=> BigO(v^2)
我错过了什么吗?为什么使用 BigO(V + E)?为什么不使用 BigO(V^2)?
【问题讨论】:
-
|E| = |V|*(|V|-1) / 2 仅当图是一个团时。如果不是派系那么|E|
-
没有。 O(V^2) 忽略了这样一个事实,即对于 V 的固定值,函数随着 E 的增加而增长。这不是“最坏情况”的问题,因为最坏的情况是算法在输入上的表现与另一个相比最差相同大小的输入。
-
@beaker 你能解释一下为什么最坏的情况在这里不适用吗?边的输入可以变化,不是吗?
-
是的,该评论现在有点断章取义,因为它最初是为响应现已删除的答案而编写的。我的意思是你不能说“复杂性是 O(V^2),因为在最坏的情况下会有 O(V^2) 边缘。”改变边的数量会改变输入的大小。因此,这不是“最坏情况”,它只是在更大的数据集上的相同情况。
-
顺便说一句,您可以在一般图中拥有多条边,因此如果“完整”图中的每个 (A,B) 都有 V 条边,则 E = V*V*(V-1 )/2。或者在最小连接树中(不确定什么是正确的英语术语,在我的语言中我们称之为一个“骨架”:))E 只是 V-1。 (我的错误:哦……当然,邻接表最多仍然是 V*(V-1)/2,除非你还考虑边缘的方向,或者其他一些人为的额外约束)
标签: data-structures graph big-o adjacency-list space-complexity