Java 3个嵌套循环的大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

另一个大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
我的想法: 所以分解它,我认为外部循环是
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)仅当循环彼此不依赖时。如果它们是独立的,则可以将它们相乘。