Java 以下嵌套for循环的Big-O类是什么?
我需要帮助弄清楚为什么Java中的以下代码段是Onlogn而不是^2。需要帮忙吗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
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分类问题。这很有帮助,而且解释得很清楚!我对你感激不尽。