我最近参与辩论/辩论,我正在努力对正确的解决方案作出明确的判决。
众所周知,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 回复:"我同意你的看法,但实际上,如果你说复杂性是O(n!)
,那么足够 < em> O(n!n^k) = O(n!)
适用于任何k >= 1
常量。&#34;
爱丽丝是否正确地记录了鲍勃的分析?
答案 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
倍。正如你可以想象的那样,差异将会增大。