典型表达式的渐近复杂度

3
以下函数的渐近复杂度从低到高排列为: (A) f1(n); f4(n); f2(n); f3(n) (B) f1(n); f2(n); f3(n); f4(n); (C) f2(n); f1(n); f4(n); f3(n) (D) f1(n); f2(n); f4(n); f3(n)
a) 这道简单问题的时间复杂度顺序为 (n^0.99)*(logn) < n ......为什么?虽然对数函数可能是一个增长缓慢的函数,但它仍然比常数增长快。
b) 假设函数f1为 f1(n) = (n^1.0001)(logn),那么答案是什么?
当表达式涉及对数和多项式之间的乘法时,对数函数会超过多项式函数吗?
c) 如何在这种情况下进行比较? 1) (n^2)logn与(n^1.5)哪个具有更高的时间复杂度? 2) (n^1.5)logn与(n^2)哪个具有更高的时间复杂度?
3个回答

3
如果我们考虑C_1和C_2,使得C_1
(n^C_2)*log(n) grows faster than (n^C_1)

这是因为(n^C_1)增长速度比(n^C_2)慢(显然)。
also, for values of n larger than 2 (for log in base 2), log(n) grows faster than 
1.

in fact, log(n) is asymptotically greater than any constant C,
because log(n) -> inf as n -> inf

if both (n^C_2) is asymptotically than (n^C_1) AND log(n) is asymptotically greater 
than 1, then we can certainly say that 
(n^2)log(n) has greater complexity than (n^1.5)

我们认为log(n)是一个“缓慢增长”的函数,但它仍然比1增长得更快,这是关键所在。


coder101在评论中提出了一个有趣的问题,实际上是:

is n^e = Ω((n^c)*log_d(n))?
where e = c + ϵ for arbitrarily small ϵ

让我们做一些代数题。

n^e = (n^c)*(n^ϵ)
so the question boils down to
is n^ϵ = Ω(log_d(n))
or is it the other way around, namely:
is log_d(n) = Ω(n^ϵ)

为了做到这一点,让我们找到一个满足 n^ϵ > log_d(n) 的 ϵ 值。
n^ϵ > log_d(n)
ϵ*ln(n) > ln(log_d(n))
ϵ > ln(log_d(n)) / ln(n)

因为我们确切地知道,这是事实。
ln(n) * c > ln(ln(n))        (1)
as n -> infinity

We can say that, for an arbitrarily small ϵ, there exists an n large enough to 
satisfy ϵ > ln(log_d(n)) / ln(n)

because, by (1), ln(log_d(n)) / ln(n) ---> 0 as n -> infinity.

有了这个知识,我们可以说:
is n^ϵ = Ω(log_d(n))
for arbitrarily small ϵ

which means that
n^(c + ϵ) = Ω((n^c)*log_d(n))
for arbitrarily small ϵ.

一个通俗易懂的说法是:
n^1.1 > n * ln(n)
for some n

also

n ^ 1.001 > n * ln(n)
for some much, much bigger n

and even
n ^ 1.0000000000000001 > n * ln(n)
for some very very big n.

1
如果是相反的情况呢?(n^1.5)logn与(n^2)。 - coder101
这有点棘手...在你发表这个评论之前,我大约考虑了15秒 :). 如果我想出来了,我会编辑我的答案。 - John M
请检查我的答案,@coder101。看看它是否有意义。 - John M
很棒的解释,你看起来像是数学方面的专家。 - coder101
让我们在聊天室中继续这个讨论 - coder101
显示剩余2条评论

1
用f1 = (n^1.0001)(logn) 替换 f1 = (n^0.9999)(logn),将得到答案(C):n,(n^1.0001)(logn),n^2,1.00001^n。
推理如下:
- (n^1.0001)(logn) 比 n 的复杂度高,显而易见。 - n^2 大于 (n^1.0001)(logn),因为多项式部分渐近支配对数部分,所以高阶多项式 n^2 胜出。 - 1.00001^n 支配 n^2,因为指数增长的 1.00001^n 比多项式增长的 n^2 渐近更快。指数增长渐近地胜出。
顺便说一下,1.00001^n 看起来有点像一个被称为“次指数”增长的家族,通常用 (1+Ɛ)^n 表示。无论 Ɛ 多小,次指数增长仍然超过任何多项式增长。

0

这个问题的复杂度介于f1(n)f2(n)之间。

对于f(n) = n ^ c where 0 < c < 1,曲线增长最终会变得非常缓慢,与线性增长曲线相比将变得微不足道。

对于f(n) = logc(n), where c > 1,曲线增长最终会变得非常缓慢,与线性增长曲线相比将变得微不足道。

这两个函数的乘积也最终将变得微不足道,与线性增长曲线相比。

因此,Theta(n ^ c * logc(n))在渐近意义下比Theta(n)更简单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接