[英]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.