以下代码的时间复杂度是多少?
a = 2;
while (a <= n)
{
for (k=1; k <= n; k++)
{
b = n;
while (b > 1)
b = b / 2;
}
a = a * a * a;
}
我正在努力处理外部while循环,这是loglogn
,我无法理解为什么。如果最后一行是a = a * a * a * a;
?
for循环为O(n)
,内部循环为O(logn)
。
总的来说,O(n*logn*loglogn)
答案 0 :(得分:1)
值将是:
a = 2 2^3 2^9 2^27 2^81 ...
等等。
现在让我们假设a的最后一个值是2^(3^k)
其中k是外部while循环的迭代次数。
为简单起见,我们假设a = n^3
,2^(3^k) = n^3
所以3^k = 3*log_2(n) => k = log_3(3log_2(n)) = (loglogn)
如果最后一行为a = a * a * a * a
,则时间复杂度将保持(loglogn)
,因为k = log_4(4log_2(n)) = (loglogn)
。
答案 1 :(得分:-3)
循环运行n次,内循环的时间复杂度为log n,因此总时间复杂度为O(n log n)