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

时间:2015-07-17 14:43:51

标签: algorithm time-complexity

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

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

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

2 个答案:

答案 0 :(得分:4)

在下面的解释中,我假设所有算术和比较操作都是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

答案 1 :(得分:1)

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

想象一下:

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每次迭代呈指数增长,现在它以指数方式成倍增长。但我们对log(log(j))步骤中的反向n超过n感兴趣。

然后外循环只意味着你做n次。