我发现了关于分析算法的这条规则:
O(max{f(n),g(n)}) = O(f(n)+g(n))
如何证明这一点?
我知道:
max{f(n),g(n)} <= f(n)+g(n) <= 2 * max{f(n),g(n)}
因此:
max{f(n),g(n)} is O(f(n)+g(n))
max{f(n),g(n)} is O(max{f(n),g(n)})
f(n)+g(n) is O(max{f(n),g(n)})
但是
如果a是O(b)而b是O(a)那么O(a)= O(b)?
答案 0 :(得分:5)
为了证明 O(max {f(n),g(n)})= O(f(n)+ g(n)),我们可以使用{{3} }:
f(x)= O(g(x))当且仅当存在正实数 M 且实数 x 0 这样的 | F(X)|所有x≥x 0 的≤M| g(x)| 。
此定义中应用的绝对值确实是一个理论问题,因为在实践中,只有函数用于大O符号formal definition of big-O足够大的x。指定负的大O复杂度是没有意义的。所以我不会在这个答案的其余部分使用那个绝对值,但假设函数产生正值。
要掌握 big-O 的概念,可能需要阅读这篇关于always give positive values的简短文章。
使用上面的定义,我们可以说一些函数 s(n):
s(n) is O(f(n)+g(n))
当且仅当有 M 这样的话
|s(n)| ≤ M(f(n) + g(n))
足够大 n ,相当于:
|s(n)| ≤ M·max{f(n), g(n)} + M·min{f(n), g(n)}
足够大 n 。
对于相同的 M ,以下也是如此 - 这里我们依赖于假设 f(n)和 g(n) 对于大型 n :
是正面的 |s(n)| ≤ 2M·max{f(n), g(n)}
足够大 n 。
如果我们现在选择 P 为 2M ,那么我们可以说我们有一个 P :
|s(n)| ≤ P·max{f(n), g(n)}
足够大 n 。
...根据big-O的定义意味着
s(n) is O(max{f(n), g(n)})
∎
s(n) is O(max{f(n), g(n)})
当且仅当有 P 这样的话
|s(n)| ≤ P·max{f(n), g(n)}
足够大 n 。
因为对于正数(参见假设)max{f(n), g(n)} < f(n)+g(n)
,这意味着以下情况肯定是正确的(我们增加了不平等的右手):
|s(n)| ≤ P(f(n) + g(n))
足够大 n 。
...根据big-O的定义意味着
s(n) is O(f(n)+g(n))
∎
以上证明,如果任何函数是 O(f(n)+ g(n))那么它也必须是 O(max {f(n),g(n) )}),反之亦然。这就像说大O复杂度都是一样的:
O(f(n)+g(n)) = O(max{f(n),g(n)})
请注意,这不是关于函数的等价,而是关于big-O表达式的等价。
实际上,您可以将big-O表达式视为一组函数,即那些具有相应大O复杂度的函数集。那么以上证明:
s(n) ∈ O(f(n)+g(n)) ⇔ s(n) ∈ O(max{f(n),g(n)})
这意味着两个O组都是相同的。
我们需要(实际)假设 f(n)和 g(n)对于足够大的 n 总是为正。它们在some的某些子集上可能是负数和/或未定义,但必须有 n ,其上 f(n)和 g(n)总是产生非负面结果。如果不是这种情况,那么可以通过一个简单的反例来证明这个前提是错误的:
g(n) = n
f(n) = -n
然后前提O(max{f(n),g(n)}) = O(f(n)+g(n))
成为:
O(n) = O(0)
显然是假的。这是因为 f(n)违反了这个假设,并且对于大 n 总是为负。但同样,负面复杂性也没有实际意义。
要明确:这些大O函数在strong的某些子集上可能是负面的,甚至是未定义的。只要上面有一个 n ,它们总是产生一个非负数,它们就符合这个假设。
在subset的子集上产生负面结果和/或未定义的允许函数的示例:
n
log(n)
n³
sqrt(n)
违反假设的函数示例:
sin(n)
cos(n)
tg(n)
-n
答案 1 :(得分:0)
这个答案假设f(n),g(n)> = 0,对于所有n> = 0.我使用这些假设,因为没有算法(我知道)可以在任何情况下具有负空间或时间使用情况。
你无法知道f(n)和g(n)是什么,所以你不能选择任何一个作为上限。
因此,唯一保留比f(n)和g(n)都大f(n)+g(n)
的选项。
答案 2 :(得分:0)
如果我们假设f(n)&amp;对于n的所有值,g(n)> = 0,则它们的总和将大于它们中的任何一个。没有这个假设,这种关系就不会成立。我们可以在逻辑上尝试一些例子。
Max(f(n) = 1 & g(n) = 3) < ((f(n) + g(n) = 4)
Max(f(n) = 5 & g(n) = 0) = ((f(n) + g(n) = 5)
Max(f(n) = 0 & g(n) = 8) = ((f(n) + g(n) = 8)
So f(n) + g(n) will always upperbound O(Max(f(n),g(n)))
i.e. O(Max(f(n),g(n))) = O(f(n) + g(n))
我们还可以证明这一事实: Max(f(n),g(n))&lt; ((f(n)+ g(n))&lt; = 2 * Max(f(n),g(n))容易因为我们总是取最大值2。 有两种情况
1:两个值都不同:在这种情况下,总和将小于 最多两次
Max(f(n) = 4 & g(n) = 1) < ((f(n) + g(n) = 5) < 2*Max(f(n) = 4 & g(n) = 1)
Max(f(n) = 3 & g(n) = 0) = ((f(n) + g(n) = 3) < 2*Max(f(n) = 3 & g(n) = 0)
1:两个值都相同:在这种情况下,总和将是最大值的两倍
Max(f(n) = 1 & g(n) = 1) < ((f(n) + g(n) = 2) = 2*Max(f(n) = 1 & g(n) = 1)
Max(f(n) = 0 & g(n) = 0) = ((f(n) + g(n) = 0) = 2*Max(f(n) = 0 & g(n) = 0)
因此
i.e. Max(f(n),g(n)) < ((f(n) + g(n)) <= 2*Max(f(n),g(n))