证明O(max {f(n),g(n)})= O(f(n)+ g(n))

时间:2016-01-27 02:52:01

标签: algorithm

我发现了关于分析算法的这条规则:

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)?

3 个答案:

答案 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) O(f(n)+ g(n))那么 s(n) O(max {f(n),g(n)})

使用上面的定义,我们可以说一些函数 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) O(max {f(n),g(n)})那么 s(n) O(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))