for (int i=0; i<n; i++)
{
int j = 2;
while (j<i)
j = j * j;
}
我认为它的n * log(n)作为第一个循环迭代n
次,但我不确定第二个循环。
答案 0 :(得分:4)
由于这个问题具有家庭作业的所有标志,我不会直接给出最终答案,而是给你一些关于如何自己到达那里的指导。
你是对的,你需要对内循环的迭代次数进行限制以确定整体界限。为了评估这一点,考虑值j
的形式将在该循环的连续迭代中采用:2,4,16,256等。根据该数字编写该数字的封闭公式是有用的。循环迭代次数。
显然,序列包括增加2的幂,但不是线性增加的幂。我们有2 1 ,2 2 ,2 4 ,2 8 ,....此时,但是,您应该识别模式,并且能够在内部循环的j
次迭代之后为k
的值编写公式,因为 k = 0 ,1,2,3 ......让内部( k )指定该公式。 (具体公式留作练习。)
那么对于给定的i
值,将执行多少次内循环迭代?变量j
在循环迭代时获取 Inner ( k )的值,循环在j >= i
时终止,因此迭代次数为最小值 k ,使 Inner ( k )至少与i
一样大,并且最大迭代次数为该循环最少 k ,使 Inner ( k )至少为n
。现在,估计n
为内部( k ),并解决 k 。
其余的细节再次留作练习。