我对for循环上的更新如何影响BIG O感到困惑
在这样的代码上:
public static void bigO(int n){
for(int i=n; i>1; i=i/2){
for (int j=n; j>1; j=j/2){
sum++;
}
}
}
我不确定更新(j=j/2)
会如何影响它。
答案 0 :(得分:3)
两个for
循环彼此独立,因此总复杂度应大致为两个循环的复杂度的乘积。每个循环为O(lgN)
,其中lg
表示“对数为2”。因此,将其相乘得出总体复杂性为O(lgN*lgN)
。
要更好地了解O(lgN)
的位置,请考虑输入值n=16
。 for
中的外部i
循环将具有以下迭代:
i | iteration #
16 | 1
8 | 2
4 | 3
2 | 4
lg(16)
实际上等于4,因为2^4 = 16
,所以这证实了我们所期望的复杂性。您也可以测试其他n
值以说服自己。 j
中的内部循环的行为相同,并且独立于i
中的外部循环。