增长的顺序

时间:2010-09-02 05:51:10

标签: time-complexity big-o

代表

f = n(log(n))^5
g = n^1.01

f = O(g)
f = 0(g)
f = Omega(g)?

我尝试将两者分开,我得到了

f = log(n)^5
g = n^0.01

但我仍然对哪一个增长得更快无能为力。有人可以帮助我解释这个答案的原因吗?我真的想知道如何(没有计算器)可以确定哪一个增长得更快。

4 个答案:

答案 0 :(得分:8)

可能最容易比较它们的对数配置文件:

如果(对于某些C1,C2,a> 0)

f < C1 n log(n)^a
g < C2 n^(1+k)

然后(足够大n)

log(f) < log(n) + a log(log(n)) + log(C1)
log(g) < log(n) + k log(n) + log(C2)

两者都以log(n)增长为主,所以问题是哪个残差更大。 log(n)残差增长得比log(log(n))快,无论k有多小或多大,所以g的增长速度都快于f。

因此就大O符号而言:g比f增长得快,所以f可以(渐近)通过像g这样的函数从上面限定:

f(n) < C3 g(n)

所以f = O(g)。类似地,g可以从下面用f界定,所以g = Omega(f)。但是f不能通过像g这样的函数从下面限制,因为g最终会超过它。所以f!= Omega(g)和f!= Theta(g)。

但是aaa提出了一个非常好的观点:在n变得非常大之前,g并没有开始支配f。

我对算法缩放没有太多经验,所以欢迎更正。

答案 1 :(得分:3)

我会将其分解为几个简单,可重复使用的引理:

引理1:对于正常数k,当且仅当f = O(k g)时f = O(g)。

证明:假设f = O(g)。然后存在常数c和N,使得| f(n)| &LT; c | g(n)|对于n> N. 因此| f(n)| &LT; (c / k)(k | g(n)|)对于n> N和常数(c / k),所以f = O(k g)。相反的情况相似。


引理2:如果h是正单调递增函数且f和g对于足够大的n是正的,那么当且仅当h(f)= O(h(g))时f = O(g)。 / p>

证明:假设f = O(g)。然后存在常数c和N,使得| f(n)| &LT; c | g(n)|对于n> N.由于f和g对n> 1是正的。 M,f(n)&lt; c g(n)n>最大值(N,M)。由于h是单调增加的,因此h(f(n))< c h(g(n))n> 1。 max(N,M),最后| h(f(n))| &LT; c | h(g(n))|对于n> max(N,M),因为h为正。因此h(f)= O(h(g))。 反过来也是如此;关键的事实是,如果h是单调增加的,那么h(a)&lt; h(b)=&gt; a&lt;湾


引理3:如果h是可逆的单调递增函数,那么当且仅当f(h)+ O(g(h))时,f = O(g)。

证明:假设f = O(g)。然后存在常数c,N,使得| f(n)| &LT; c | g(n)|对于n> N.因此| f(h(n))| &LT; c | g(h(n))|对于h(n)> N.由于h(n)是可逆的并且单调递增,因此h(n)> 0。 N只要n> H ^ -1(N)。因此,h ^ -1(N)是我们需要的新常数,并且f(h(n))= O(g(h(n))。 反之亦然,使用g的逆。


引理4:如果对于n> h,则n(n)非零。 M,f = O(g)当且仅当f(n)h(n)= O(g(n)h(n))。

证明:如果f = O(g),则对于常数c,N,| f(n)| &LT; c | g(n)|对于n> N.从| h(n)|对于n>是正的M,| f(n)h(n)| &LT; c | g(n)h(n)|对于n> max(N,M)和f(n)h(n)= O(g(n)h(n))。 通过使用1 / h(n),类似地遵循相反的步骤。


引理5a:log n = O(n)。

证明:设f = log n,g = n。然后f'= 1 / n并且g'= 1,因此对于n> 1。 1,g比f增加得更快。此外,g(1)= 1> 0 = f(1),所以| f(n)| &LT; | G(N)|对于n> 1和f = O(g)。

引理5b:n!= O(log n)。

证明:假设另有矛盾,让f = n和g = log n。然后对于一些常数c,N,| n | &LT; c | log n |对于n> Ñ

设d = max(2,2c,sqrt(N + 1))。通过引理5a中的计算,因为d> 2&gt; 1,log d&lt; d。从而 | F(2D ^ 2)| = 2d ^ 2> 2d(log d)&gt; = d log d + d log 2 = d(log 2d)&gt; 2c log 2d&gt; c log(2d ^ 2)= c g(2d ^ 2)= c | g(2d ^ 2)|对于2d ^ 2> N,矛盾。因此f!= O(g)。


现在我们可以汇总您最初提出的问题的答案。

第1步:

log n = O(n^a)
n^a != O(log n)

任何正常数a。

证据:由引理5a记录n = O(n)。因此,对于Lemmas 3(对于h(n)= n ^ a),4和1,log n = 1 / a log n ^ a = O(1 / an ^ a)= O(n ^ a)。第二个事实通过使用引理5b进行类似的跟踪。

第2步:

log^5 n = O(n^0.01)
n^0.01 != O(log^5 n)

证明:通过步骤1记录n = O(n ^ 0.002)。然后通过引理2(具有h(n)= n ^ 5),log ^ 5 n = O((n ^ 0.002)^ 5)=为O(n ^ 0.01)。第二个事实也是如此。

最终答案:

n log^5 n = O(n^1.01)
n^1.01 != O(n log^5 n)

换句话说,

f = O(g)
f != 0(g)
f != Omega(g)

证明:将引理4(使用h(n)= n)应用于步骤2.

通过练习,这些规则变得“显而易见”和第二天性。除非你的测试要求你证明你的答案,否则你会发现自己正在解决这些大问题。

答案 2 :(得分:2)

检查他们的十字路口怎么样?

Solve[Log[n] == n^(0.01/5), n]

                                       1809
{{n -> 2.72374}, {n -> 8.70811861815 10    }}

我和Mathematica作弊

你也可以用衍生物推理,

In[71]:= D[Log[n], n]

1
-
n
In[72]:= D[n^(0.01/5), n]

0.002
------
 0.998
n

考虑当n变得非常大时会发生什么,首先变化趋于零,后来的函数不会失去它的导数(指数大于0)。

这告诉你哪个理论上更复杂。 但是在实际区域,第一个功能将会更快地增长。

答案 3 :(得分:0)

这不是100%数学上的犹太教徒而没有证明一些关于日志的东西,但他在这里说:

f = log(n)^5
g = n^0.01

我们记录两者:

log(f) = log(log(n)^5)) = 5*log(log(n)) = O(log(log(n)))
log(g) = log(n^0.01) = 0.01*log(n) = O(log(n))

从这里我们看到第一个渐渐变慢,因为它有一个双重日志并且日志增长缓慢。一个非正式的论点,为什么通过获取日志的这种推理是有效的:log(n)大致告诉你数字n中有多少位数。因此,如果g的位数渐渐快于f的位数增长,那么实际数字g的增长肯定比数字f快!