Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以下嵌套for循环的Big-O类是什么?_Java_Big O - Fatal编程技术网

Java 以下嵌套for循环的Big-O类是什么?

Java 以下嵌套for循环的Big-O类是什么?,java,big-o,Java,Big O,我需要帮助弄清楚为什么Java中的以下代码段是Onlogn而不是^2。需要帮忙吗 int sumSome(int[] arr){ int sum = 0; for (int i=0; i<arr.length; i++) { for (int j=1; j<arr.length; j = j*2) { if (arr[i] > arr[j]) sum += arr[i]; } } ret

我需要帮助弄清楚为什么Java中的以下代码段是Onlogn而不是^2。需要帮忙吗

int sumSome(int[] arr){
   int sum = 0;
   for (int i=0; i<arr.length;  i++) {
      for (int j=1; j<arr.length; j = j*2) {
         if (arr[i] > arr[j])
            sum += arr[i];
      }
   }
   return sum;
}

考虑一个一般的数字间隔可能会有所帮助,比如1到100

如果一个接一个地循环该间隔,循环将打开 如果按任何线性步长循环,如每次2或每次10,循环将为On/2、On/10等,这仍然简化为On。 但是,如果每次通过循环时循环步长的大小都发生变化,则会得到不同的结果:

如果在范围内循环,同时每次将步长加倍1、2、4、8、16、32、64,则在到达终点之前,将只运行循环7次。这是步长的指数增长,对应于循环的对数次数:1+log100,对数基数2向下舍入,这简化为Olog n。 如果您每次将步长乘以3,1,3,9,27,81,它将使用logbase 3循环1+log100次,这仍然简化为Olog n。等等 所以在你的例子中,你有你的外循环On乘以你的内循环Olog n,导致一个组合On*log n


不同时间复杂性的好例子可以在中找到。

考虑一个一般的数字间隔可能会有所帮助,比如1到100

如果一个接一个地循环该间隔,循环将打开 如果按任何线性步长循环,如每次2或每次10,循环将为On/2、On/10等,这仍然简化为On。 但是,如果每次通过循环时循环步长的大小都发生变化,则会得到不同的结果:

如果在范围内循环,同时每次将步长加倍1、2、4、8、16、32、64,则在到达终点之前,将只运行循环7次。这是步长的指数增长,对应于循环的对数次数:1+log100,对数基数2向下舍入,这简化为Olog n。 如果您每次将步长乘以3,1,3,9,27,81,它将使用logbase 3循环1+log100次,这仍然简化为Olog n。等等 所以在你的例子中,你有你的外循环On乘以你的内循环Olog n,导致一个组合On*log n


不同时间复杂度的好例子可以在中找到。

这是因为j在内环j=j*2的每次迭代中都加倍。如果每次只增加1,那么代码将在^2Oh上,我想这也是因为最初的j*2。但是你能更详细地解释一下,这会对内部循环的每次迭代造成什么影响,从而导致整个代码段被Onlogn控制吗?在内部循环中,我们以2的幂进行迭代,比如j=1,2,4,8。。。。它将在某个迭代k处停止,这样2^k+1>n。因此,我们将在内部循环中进行Ologn迭代。外环总是n。所以总的来说,它是唯一的,因为j在内部循环j=j*2的每次迭代中都加倍。如果每次只增加1,那么代码将在^2Oh上,我想这也是因为最初的j*2。但是你能更详细地解释一下,这会对内部循环的每次迭代造成什么影响,从而导致整个代码段被Onlogn控制吗?在内部循环中,我们以2的幂进行迭代,比如j=1,2,4,8。。。。它将在某个迭代k处停止,这样2^k+1>n。因此,我们将在内部循环中进行Ologn迭代。外环总是n。所以总的来说,这是唯一的哇,这使更多的意义现在!非常感谢您帮助解决这个嵌套循环的Big-O分类问题。这很有帮助,而且解释得很清楚!我真是太感谢你了。哦,哇,这让我觉得更有意义了!非常感谢您帮助解决这个嵌套循环的Big-O分类问题。这很有帮助,而且解释得很清楚!我对你感激不尽。