【发布时间】:2015-10-02 06:08:46
【问题描述】:
让
- m = 图中的边数
- n = 图中的顶点数
假设图 G(V,E) 是无向且连通的。
我所做的是将 m 替换为 (n*(n-1)/2),因为就节点数而言,这是可能的最大边。
所以,我发现这是真的,
但是,真正的答案是错误的。
有人可以从概念上解释与 Big-Oh 复杂性相比的含义吗?
【问题讨论】:
标签: graph asymptotic-complexity
让
假设图 G(V,E) 是无向且连通的。
我所做的是将 m 替换为 (n*(n-1)/2),因为就节点数而言,这是可能的最大边。
所以,我发现这是真的,
但是,真正的答案是错误的。
有人可以从概念上解释与 Big-Oh 复杂性相比的含义吗?
【问题讨论】:
标签: graph asymptotic-complexity
边数m 是正确的
m <= (n*(n-1)/2)
和
n*(n-1)/2 = (n^2-n)/2
这意味着问题中的推理产生了
m+n <= (n^2-n)/1+n = O(n^2)
与O(m) 的复杂度相同;但是,以明确考虑边数和节点数的方式说明算法的复杂性比使用最坏情况下的界限(n^2-n)/2 更精确。
【讨论】:
答案:是的
图是连通的 => m >= n-1 => m = n-1+k where k >= 0.
但是m <= n(n-1)/2 因为如果每 2 个节点之间有一条边,则不需要更多边。 => n-1+k <= n(n-1)/2 => k <= (n-1)(n/2-1) => k <= (n-1)(n-2)/2.
所以,我们有 m = n - 1 + k 其中 0 <= k <= (n-1)(n-2)/2 ; k 表示超过连接所需的最小数量的边数。
O(m+n) = O(n-1+k+n) = O(2n-1+k) = O(2n+k) = a
O(m) = O(n-1+k) = O(n+k) = b
现在,让我们分三种情况:
lim(n->inf) n/k = 0
a = O(k(2n/k + 1)) = O(k)
b = O(k(n/k + 1)) = O(k)
lim(n->inf) n/k = constant
a = O(2*constant*k + k) = O(another_constant * k) = O(k)
b = O(constant*k + k) = O(another_constant2 * k) = O(k)
lim(n->inf) n/k = inf => lim(n->inf) k/n = 0
a = O(n(2 + k/n)) = O(2n) = O(n)
b = O(n(1 + k/n)) = O(n)
所以,在任何情况下都是如此。
【讨论】:
k是连接组件的数量吗?
k 是超过连接所需的最小边数的边数。
你的想法在我看来是正确的,只有一个例外。
你能确定两个相同的顶点之间不能有两条或多条边吗?那么图不是多图?
否则m = X * (n*(n-1))/2 其中X 可以增长到无穷大,它是问题中的一个新变量。那么复杂度将类似于O(X*n*n)。
无论如何,等式仍然是正确的,因为第一个子句中的+n 仍然可以省略(因为二次函数“过度充电”线性函数)。
【讨论】: