在伪代码中:
j = 5;
while (j <= n) {
j = j* j* j * j;
}
此代码的时间复杂度是多少? 它比O(logn)短,是否有任何理由低于这个?
答案 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)))。