Java 3个嵌套循环的大O
另一个大O表示法的问题…什么是大O表示错误代码:Java 3个嵌套循环的大O,java,loops,big-o,nested-loops,Java,Loops,Big O,Nested Loops,另一个大O表示法的问题…什么是大O表示错误代码: for (int i = n; i > 0; i = i / 2){ for (int j = 0; j < n; j++){ for (int k = 0; k < n; k++){ count++; } } } for(int i=n;i>0;i=i/2){ 对于(int j=0;j
for (int i = n; i > 0; i = i / 2){
for (int j = 0; j < n; j++){
for (int k = 0; k < n; k++){
count++;
}
}
}
for(int i=n;i>0;i=i/2){
对于(int j=0;j
我的想法:
所以分解它,我认为外部循环是O(log2(n))
,然后每个内部循环都是O(n)
,这将导致O(n^2*log2(n))
问题#1是否正确
问题#2:
当组合嵌套循环时,它是否总是简单到将每个循环的大O重叠
logN
,另外两个分别是N
,总共是O(N^2*logN)
当循环计数器彼此不依赖时,总是可以从内向外工作 最里面的循环总是需要时间O(n),因为不管j和i的值是多少,它都会循环n次 当第二个循环运行时,它会运行O(n)次迭代,每次迭代都会执行O(n)次工作来运行最内部的循环。这需要时间O(n2) 最后,当外部循环运行时,它在每次迭代中做O(n2)个功。它还运行O(logn)次迭代,因为它的运行次数等于在达到1之前必须将n除以2的次数。因此,总功为O(n2对数n) 通常,不能将循环相乘,因为它们的边界可能相互依赖。不过,在这种情况下,由于没有依赖关系,运行时可以成倍增加。希望上面的推理能够解释为什么会这样——因为如果你从内到外思考每个循环做了多少工作,做了多少次,运行时最终会成倍增加 希望这有帮助 要更正式地回答这个问题,可以说
T(n)
是完成算法所需的时间(或操作次数)。然后,对于外部循环,T(n)=log n*T2(n)
,其中T2(n)
是循环内部的操作数(忽略任何常数)。类似地,T2(n)=n*T3(n)=n*n
然后,使用以下定理:
如果f1(n)=O(g1(n))和f2(n)=O(g2(n)),那么f1(n)×f2(n)=O(g1(n)×g2(n))这就给我们留下了T(n)=O(n2logn)
“组合嵌套循环”就是这个定理的一个应用。问题可能在于准确计算每个循环使用的操作数,在本例中,这很简单。您可以使用Sigma符号进行正式操作,以忠实地模拟您的循环:
1)是2)仅当循环彼此不依赖时。如果它们是独立的,则可以将它们相乘。