for i = 1 to n do
j = 2
while j < i do
j = j * j
我认为它的时间复杂度是:log(n!)= n * log(n)。
但是解决方案说它是:n * loglog(n)并且我不明白为什么?
答案 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
次。