Big o 有人请给我解释一下这两个java代码之间的复杂程度吗?我很困惑? for(int i=n,i>0;i/=2){ 对于(int j=1,j

Big o 有人请给我解释一下这两个java代码之间的复杂程度吗?我很困惑? for(int i=n,i>0;i/=2){ 对于(int j=1,j,big-o,Big O,外循环和中循环执行相同的次数,每个sqrt(n)。内循环执行n/2次。因为它们是嵌套的,所以可以将它们相乘,总共执行sqrt(n)*sqrt(n)*n/2个关键步骤。这等于n^2/2,当n接近无穷大时,限制为n^2,因此它在O(n^2)中函数的分类。当被问及函数属于哪一个族时,你实际上不只是取最大的N值,而是取渐近极限。这里是#2格式的可读性: for( int i = n; i > 0; i - -) { for( int j = 1; j < n; j *= 2 )

外循环和中循环执行相同的次数,每个sqrt(n)。内循环执行n/2次。因为它们是嵌套的,所以可以将它们相乘,总共执行sqrt(n)*sqrt(n)*n/2个关键步骤。这等于n^2/2,当n接近无穷大时,限制为n^2,因此它在O(n^2)中函数的分类。当被问及函数属于哪一个族时,你实际上不只是取最大的N值,而是取渐近极限。

这里是#2格式的可读性:

 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
         }
     }
 }
总共

00001
00010
00100
01000
10000
也就是2*N-1,或者O(N)

将其乘以i-loop范围N得到O(N^2)

有趣的问题

for( int i = n; i > 0; i --) 
  for( int j = 1; j < n; j *= 2 ) 
    for( int k = 0; k < j; k++ )
      action
00001
00010
00100
01000
10000
11111