有人给我解释一下这个Java大O代码的几个步骤 for(int-bound=1;bound

有人给我解释一下这个Java大O代码的几个步骤 for(int-bound=1;bound,java,big-o,Java,Big O,第一个循环中bound的值将每次迭代加倍,直到n:1,2,4…n 第二个循环运行到bound的值,总计:1+2+4+…+n=O(n) 第三个和第四个循环是O(n)和O(logn),它们加在一起就是O(n),因为n支配logn 所以前两个循环一起是O(n),内部两个循环一起是O(n)。相乘,它们是O(n^2)O的规则是O(a+b)=O(max(a,b)),O(const*a)=O(a)。(max的复杂性与实际数字不同) 所以最里面的循环都是O(n),它们一起是O(n+n)=O(max(n,n))=

第一个循环中
bound
的值将每次迭代加倍,直到
n
1,2,4…n

第二个循环运行到
bound
的值,总计:
1+2+4+…+n=O(n)

第三个和第四个循环是
O(n)
O(logn)
,它们加在一起就是
O(n)
,因为
n
支配
logn

所以前两个循环一起是
O(n)
,内部两个循环一起是
O(n)
。相乘,它们是
O(n^2)
O的规则是O(a+b)=O(max(a,b)),O(const*a)=O(a)。(max的复杂性与实际数字不同)

所以最里面的循环都是O(n),它们一起是O(n+n)=O(max(n,n))=O(n)

中间的循环是O(n),但外部的循环是O(logn),这是O(n*n*logn)。这不是一个错误O只是操作的一个上限,任何O(n)也是O(n*n)

但我们可以做得更好


每次中间循环执行时,它执行的操作数都是原来的两倍。它从1开始,然后是2,4,8等等。中间循环和最外层循环一起执行1+2+4+8+…+n个操作。这是O(n+m-1),其中m是n-1之后的2的第一次幂。但正因为如此,n(n+2)不是时间复杂度,我想你是指O(n)-linearNo,我想它是O(n^2)。这里只有两个嵌套的循环。内部的两个不是嵌套的,所以它不是O(n^3)。它们只是相加。对于第三个循环?它做线性数目的运算,从j=0到n,按2的方式递增-如果有O(n^2)+O(n)而n就像10000000000一样,O(n)真的很重要吗?既然它不重要了,你就把它去掉,只剩下O(n^2)。@duffymo:loops
bound
(O[logn])、
i
(O[bound])和
j
(O[n])嵌套的三层是深的吗,不是吗?第四层不是线性的,它的对数,每次运行它都会把指数乘以2,我觉得我的不好。谢谢。我不打算纠正它,但是,它还是一样的。所以我可以问一下,外环是logn,中环和内环是n,所以logn*n*n是n^2,因为它支配logn?再加上一,看看为什么两个外循环加起来就是O(n):1+2+4+8+..+n=2N-1。就像二进制数字是如何工作的。这就是O(n)我可以问一下为什么外循环不是logn,它一直乘以2。它不应该是n*logn吗?@JohnHenderson外循环确实是
O(log(n))
,但是添加第二个循环会得到
O(n)由于第二个循环的迭代依赖于第一个循环,通过<代码>绑定< /代码>变量,所以我们需要同时考虑它们。谢谢!你是说第二个循环是n,因为它支配了log n,我是正确的吗?@约翰亨德森,这更像两个循环对时间复杂度的贡献。两个循环的f迭代得到的和为1+2+4+…+n,即O(n)。
for( int bound = 1; bound <= n; bound *= 2 ) { 
     for( int i = 0; i < bound; i++ ) { 
        for( int j = 0; j < n; j += 2 ) { 
        ... // constant number of operations 
        } 
        for( int j = 1; j < n; j *= 2 ) { 
        ... // constant number of operations 
     } 
   } 
}