这个简单代码的时间复杂性

时间:2017-09-11 14:19:10

标签: algorithm time-complexity

在伪代码中:

j = 5;

while (j <= n) {

    j = j* j* j * j;
}

此代码的时间复杂度是多少? 它比O(logn)短,是否有任何理由低于这个?

2 个答案:

答案 0 :(得分:3)

让我们跟踪代码的执行情况。假设我们从初始值j0开始:

0. j ← j0
1. j ← j0^4
2. j ← [j0^4]^4 = j0^(4^2)
3. j ← [j0^(4^2)]^4 = j0^(4^3)
4. j ← [j0^(4^3)]^4 = j0^(4^4)
...
m. j ← [j0^(4^(m-1))]^4 = j0^(4^m)

... m循环之后。

当值超过n时,循环终止:

j0^(4^m) > n
→m > log(4, log(j0, n))

因此时间复杂度为O(m) = O(log log n)

答案 1 :(得分:0)

我使用help from MathSE来了解如何解决这个问题。答案与@meowgoesthedog的答案相同,但我理解如下:

在每次迭代中,j的值将增加其自身的4 th 次幂。或者,我们可以从 n 一侧查看它,在每次迭代时 n 将减少4 th 根。因此,重现将如下:

  

T(n)= 1 + T(n 1/4

对于任何整数 k ,其中2 4 k + 1&lt; = n&lt; = 2 4 k + 1 ,复发将成为:

  

T(n)= 1 + k

如果我们继续假设4 th 根将始终是一个整数。如果不是,那么在Big-O计算中将忽略+/- 1的常数将无关紧要。

现在,由于假设4 th root是一个整数,我们可以尝试解决以下等式:

n = 2 4 k

用等式产生k =(Log(Log(n)) - Log(2))/ Log(4)。

这意味着O(T(n))= O(Log(Log(n)))。