作为一个时间复杂性的例子(刷新我的想法)我试图解决以下算法的运行时间(以n为单位):
for (i=1; i <= n; i++) { //O(n)
k = 1;
for (j=1; j <= i; j++) { //O(n)
k = 2*k;
}
j = k*k;
while (j > 1) { //O(..?)
j = j / 2;
}
}
我理解前两个for循环组合需要O(n ^ 2),但是我对如何找到while循环的运行时间感到有些困惑。虽然我知道while循环在第一次执行时运行两次,然后是4次,然后是6 ...所有的2的倍数。这会让它运行O(nlog(n))次吗?
答案 0 :(得分:1)
重复除法为log_2(j)
,与log(j) / log(2)
相同。 log(2)
是不变的,所以它只是写成log(j)
。
由于O(log(n))
与O(n)
循环的深度相同,而O(n)
循环使O(log(n))
循环相同,因此两者合并需要O(n)
次。
最终时间复杂度为O(n^2)
。
答案 1 :(得分:0)
对于i的每个值,我们执行两个循环。
第一个为i的每个值执行i次 第三个,j从2 ^ i开始,并且成功地被2分割,因此它也执行了i次。
总共有O(1 + 2 + .. + n)~O(n(n + 1)/ 2)~O(n ^ 2)