Time complexity 增长顺序

Time complexity 增长顺序,time-complexity,big-o,Time Complexity,Big O,为了 是 我试着把两者都除以n,结果 f = O(g) f = 0(g) f = Omega(g)? 但我仍然不知道哪一个生长得更快。有人能帮我解释一下原因吗?我真的很想知道(不使用计算器的情况下,)如何确定哪一个增长更快。比较它们的对数曲线可能最容易: 如果(对于某些C1、C2、a>0) f1,g的增长速度比f快。此外,g(1)=1>0=f(1),对于n>1和f=O(g),则| f(n)2>1,log d2d(logd)>=dlogd+dlog2=d(log2d)>2clog2d>clog(

为了

我试着把两者都除以n,结果

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

但我仍然不知道哪一个生长得更快。有人能帮我解释一下原因吗?我真的很想知道(不使用计算器的情况下,)如何确定哪一个增长更快。

比较它们的对数曲线可能最容易:

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

f
然后(对于足够大的n)

log(f)
两者都受对数(n)增长的控制,所以问题是哪个残差更大。log(n)残差的增长速度比log(log(n))快,无论k有多小或a有多大,因此g的增长速度都比f快

所以用大O表示法:g的增长速度比f快,所以f可以(渐近地)从上面被一个类似g的函数所限定:

log(f) < log(n) + a log(log(n)) + log(C1)
log(g) < log(n) + k log(n) + log(C2)
f(n)
所以f=O(g)。类似地,g可以由f从下方限定,因此g=ω(f)。但是f不能从下面被g这样的函数所限定,因为g最终会超过它。那么f!=ω(g)和f!=θ(g)

但aaa提出了一个很好的观点:直到n变得非常大,g才开始支配f


我对算法缩放没有太多经验,因此欢迎进行更正。

检查它们的交点如何

f(n) < C3 g(n)
我用Mathematica作弊

你也可以用衍生品来推理

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

                                       1809
{{n -> 2.72374}, {n -> 8.70811861815 10    }}
考虑当n变得非常大时会发生什么,第一个函数的变化趋于零,第二个函数不会失去它的导数(指数大于0)

这告诉你理论上哪个更复杂。
但是在实际应用中,第一个函数的增长速度会更快。

我将把它分解为几个简单的、可重用的引理:

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

证明:假设f=O(g)。然后存在常数c和N,使得N>N时| f(N)|n和常数(c/k),所以f=O(kg)。相反,两者有点相似


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

证明:假设f=O(g)。然后存在常数c和N,使得N>N时| f(N)|M是正的,所以对于N>max(N,M),f(N)max(n,M),最后是h(f(n))max(n,M),因为h是正的。因此h(f)=O(h(g))。 反之亦然;关键的事实是,如果h是单调递增的,那么h(a)a
引理3:如果h是可逆单调递增函数,则f=O(g)当且仅当f(h)+O(g(h))

证明:假设f=O(g)。然后存在常数c,N,使得| f(N)|N。因此| f(h(N))|N。因为h(N)是可逆的且单调递增的,所以当N>h^-1(N)时,h(N)>N。因此h^-1(N)是我们需要的新常数,f(h(N))=O(g(h(N))。 相反,使用g的倒数,也会出现类似的情况


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

证明:如果f=O(g),那么对于常数c,N,| f(N)|N。因为| h(N)|对于N>M是正的,所以| f(N)h(N)|max(N,M)和so f(N)h(N)=O(g)h(N))。 相反,使用1/h(n)也会出现类似的情况


引理5a:logn=O(n)

证明:假设f=logn,g=n。那么f'=1/n和g'=1,因此对于n>1,g的增长速度比f快。此外,g(1)=1>0=f(1),对于n>1和f=O(g),则| f(n)<| g(n)|

引理5b:n!=O(对数n)

证明:对于矛盾,假设相反,让f=n和g=logn。然后对于一些常数c,n,| n |n

设d=max(2,2c,sqrt(N+1)),通过引理5a中的计算,由于d>2>1,log d2d(logd)>=dlogd+dlog2=d(log2d)>2clog2d>clog(2d^2)=cg(2d^2)=cg(2d^2)=cg(2d^2)|对于2d^2>N,这是一个矛盾。因此f!=O(g)


现在我们可以把你最初问的问题的答案组合起来

步骤1:

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

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

0.002
------
 0.998
n
对于任何正常数a

证明:用引理5a记录n=O(n)。因此,用引理3(对于h(n)=n^a)、4和1记录n=1/a记录n^a=O(1/a n^a)=O(n^a)。第二个事实类似地用引理5b得出

步骤2:

log n = O(n^a)
n^a != O(log n)
证明:通过步骤1记录n=O(n^0.002)。然后通过引理2(h(n)=n^5),记录^5n=O((n^0.002)^5)=O(n^0.01)。第二个事实类似

最后答覆:

log^5 n = O(n^0.01)
n^0.01 != O(log^5 n)
换句话说,

n log^5 n = O(n^1.01)
n^1.01 != O(n log^5 n)
证明:将引理4(使用h(n)=n)应用于步骤2


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

如果不证明一些关于日志的东西,这不是100%的数学洁净度,但他说:

f = O(g)
f != 0(g)
f != Omega(g)
我们记录了以下两种情况:

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

从这一点我们可以看到,第一个逻辑逐渐变慢,因为它有一个双对数,并且对数增长缓慢告诉您数字n中大约有多少位数。因此,如果g的位数逐渐增长快于f的位数,那么实际数字g的增长肯定快于f!

这可能更适合。对于mathoverflow可能太基本了。@Space\u COwbOy这不适合mathoverflow.net!这是为从事原创工作的研究数学家准备的。这是一条路。哈哈,是的,我不知道为什么这会被视为离题。是的,这是一个CS类(算法)的家庭作业问题。“但是如果你的问题通常涉及……软件算法”
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)
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))