Big o 有人帮助解释这个java代码的巨大复杂性,我';我很困惑 for(int i=n;i>0;i--){ 对于(int j=1;j

Big o 有人帮助解释这个java代码的巨大复杂性,我';我很困惑 for(int i=n;i>0;i--){ 对于(int j=1;j,big-o,Big O,对于这个代码,N=2^m,正确答案是O(N^2)。我的教授说中间环和内部环是相互依赖的,所以中间环和内部环一起形成一个系列2^0+2^1+2^2+…+2(log(N)),该级数的和为2N。两个内环一起形成2N。2N*n^2=O(n^2)。请有人给我解释一下这部分,我的教授是如何得到答案的?因为我认为内部和中间的循环会是logn*N 但从我的角度来看,我不是每个循环都取大O,从外部开始,N*logn*N=N^2*logn。为什么我的方法错了?我如何知道何时加号或乘法。第一个循环迭代N次,第二个循环

对于这个代码,N=2^m,正确答案是O(N^2)。我的教授说中间环和内部环是相互依赖的,所以中间环和内部环一起形成一个系列2^0+2^1+2^2+…+2(log(N)),该级数的和为2N。两个内环一起形成2N。2N*n^2=O(n^2)。请有人给我解释一下这部分,我的教授是如何得到答案的?因为我认为内部和中间的循环会是logn*N


但从我的角度来看,我不是每个循环都取大O,从外部开始,N*logn*N=N^2*logn。为什么我的方法错了?我如何知道何时加号或乘法。

第一个循环迭代N次,第二个循环迭代
logn
次,因为
j
在每个循环上都是双倍的

对于第二个循环的每次迭代,第三个循环迭代
j
次。然后首先它迭代1次,当
j
为1时,当
j
变为2时,它迭代2次,当
j
变为4时,它迭代4次。。。。。 然后这两个循环迭代1+2+4+。。。2^logn=2*n-1


那么整个程序的时间是N*(2*N-1)=O(N^2)

所以你是说最后两个循环是链接在一起的,因此我不应该把它们看作是log N和N,而是O(N)是的,最后一个循环依赖于在第二个循环中变化的
j
,由于迭代次数不是恒定的,因此不能将迭代次数相乘,必须对第二个循环的每个迭代的最后一个循环迭代次数求和。
 for( int i = n; i > 0; i-- ) {
      for( int j = 1; j < n; j *= 2 ) {
       for( int k = 0; k < j; k++ ) {
          ... // constant number C of operations
            }
        }
      }