哪个Big-O渐近增长更快
我最近卷入了一场争论/辩论,我正试图对正确的解决方案做出明确的判断 众所周知,但到底有多快,足以“隐藏”可能添加到其中的所有附加常量 假设我有一个愚蠢而简单的程序(没有特定的语言): 假设输入是哪个Big-O渐近增长更快,big-o,time-complexity,asymptotic-complexity,Big O,Time Complexity,Asymptotic Complexity,我最近卷入了一场争论/辩论,我正试图对正确的解决方案做出明确的判断 众所周知,但到底有多快,足以“隐藏”可能添加到其中的所有附加常量 假设我有一个愚蠢而简单的程序(没有特定的语言): 假设输入是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
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回答:“我同意你的看法,bob,但实际上,如果你说复杂性是O(n!)
,那就足够了,因为O(n!n^k)=O(n!)
对于任何k>=1
常数来说都是如此。”
Alice在Bob的分析笔记中是对的吗?Alice是错的,Bob是对的 在使用limit时,回想一下与大O表示法等效的定义:
f(n) is in O(g(n)) iff
lim_n->infinity: f(n)/g(n) < infinity
因此,
n*n^k
不在O(n!)
Amit解决方案是完美的,我只想添加更多的“人性化”解决方案,因为初学者可能很难理解定义
定义基本上是这样的-如果你增加值n
,并且方法f(n)
和g(n)
只“不同”k
,其中k
是常数并且没有变化(例如g(n)
总是高出约100倍,无论n=10000
还是n=1000000
),那么这些函数具有相同的复杂性
如果g(n)
比n=10000
高100倍,比n=1000000
高80倍,那么f(n)
具有更高的复杂性!因为当n
不断增长时,f(n)
最终会在某个点到达g(n)
,然后它会比g(n)
增长得越来越多。在复杂性理论中,你感兴趣的是,它将如何以“无限”(或更可想象的极高n值)结束
如果你比较n代码>和n*n^2
,您可以看到,对于n=10
,第二个函数的值要高出10^2=100倍。对于n=1000
,它的值要高出1000^2=1000000
倍。正如你所能想象的那样,差别会越来越大
f(n) is in O(g(n)) iff
lim_n->infinity: f(n)/g(n) < infinity
lim_n->infinity: (n!*n^k) / n! = lim_n->infinity n^k = infinity