哪个Big-O渐近增长更快

时间:2016-01-25 19:41:32

标签: big-o time-complexity asymptotic-complexity

我最近参与辩论/辩论,我正在努力对正确的解决方案作出明确的判决。

众所周知,n! grows very quickly,但确切有多快,足以隐藏"可能添加到其中的所有其他常量?

我们假设我有这个愚蠢的&简单的程序(没有特定的语言):

for i from 0 to n! do:
    ; // nothing

鉴于输入为n,其复杂性显然是 O(n!) (甚至 ϴ(n!) 这里并不相关。)

现在让我们假设这个程序:

for i from 0 to n do:
    for j from 0 to n do:
        for k from 0 to n! do:
            ; // nothing

Bob 声称:"此计划的复杂性显然是 O(n)O(n)O(n!) = O(n!n^2) = O((n+2)!) 。"

Alice 回复:&#34;我同意你的看法,但实际上,如果你说复杂性是O(n!),那么足够 < em> O(n!n^k) = O(n!) 适用于任何k >= 1常量。&#34;

爱丽丝是否正确地记录了鲍勃的分析?

2 个答案:

答案 0 :(得分:9)

爱丽丝错了,鲍勃是对的。

使用限制时,回想一下大O符号的等效定义:

f(n) is in O(g(n)) iff 
lim_n->infinity: f(n)/g(n) < infinity

对于任何k>0

lim_n->infinity: (n!*n^k) / n! = lim_n->infinity n^k = infinity

因此,n!*n^k不在O(n!)

答案 1 :(得分:1)

Amit解决方案是完美的,我只会添加更多“人类”解决方案,因为理解定义对于初学者来说可能很难。

定义基本上说 - 如果你增加了值n,方法f(n)g(n)“仅”k - 次,{{1} }是常量且不会改变(例如,k总是大约100倍,无论g(n)还是n=10000),这些函数都具有相同的复杂性。

如果n=1000000 g(n)高100倍,n=10000高出80倍,则n=1000000复杂度更高!因为随着f(n)的增长和增长,n最终会在某个时刻到达f(n),然后与g(n)相比会越来越多。在复杂性理论中,你感兴趣的是,它将如何以“无穷大”(或更可想象的极高值n)结束。

如果您比较g(n)n!,您可以看到,对于n!*n^2,第二个函数的值高n=10倍。对于10^2=100,其价值高出n=1000倍。正如你可以想象的那样,差异将会增大。