繁体   English   中英

这个算法的时间复杂度是多少?

[英]What is the time complexity for this Algorithm?

for i = 1 to n do
    j = 2
    while j < i do
        j = j * j

我认为它的时间复杂度是:log(n!)= n * log(n)。

但解决方案说它是:n * loglog(n)我不明白为什么?

在下面的解释中,我假设所有算术和比较操作都是O(1)。

for i = 1 to n do

下面重复N次,这使得n *部分在解决方案中。

    j = 2
    while j < i do
        j = j * j

以上计算以下序列的第一个数字>= i

2 = 2^(2^0)
4 = 2^(2^1)
16 = 2^(2^2)
256 = 2^(2^3)
65536 = 2^(2^4)
...

所以你唯一需要做的就是找到i和2 ^(2 ^ i)之间的关系。 并且log(log(2^(2^i))) = log(2^i) = i

让我们分解它并从内到外工作。

想象一下:

j = 2
while j < n do
  j = j * 2

j变为2,4,8,16 ......,所以如果n的大小加倍,则j只需要大约一次迭代就超过它。 这基本上是对数的定义。

你的情况下的内部循环有点不同:

j = 2
while j < n do
  j = j * j

现在j变为2,4,16,256,65536 ......并且更容易超过n 在第一种情况下, j每次迭代呈指数增长,现在它呈指数增长。 但我们感兴趣的inverse-- j超过n日志(LOG( n ))的步骤。

然后外循环就意味着你这样做了n次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM