Java 这个三重嵌套for循环的运行时间是多少?

Java 这个三重嵌套for循环的运行时间是多少?,java,time-complexity,Java,Time Complexity,代码如下: for (int i = 0; i < 60; i++) { for (int j = i-1; j < N; j++) { for (int k = 0; k+2 < N; k++) { System.out.println(i*j); System.out.println(i); i=i+1;

代码如下:

    for (int i = 0; i < 60; i++) {
        for (int j = i-1; j < N; j++) {
            for (int k = 0; k+2 < N; k++) {
                System.out.println(i*j);
                System.out.println(i);
                i=i+1;
             }
        }
    }
for(int i=0;i<60;i++){
对于(int j=i-1;j
我相信它是O(N^2),因为for循环中有两个N,但不太确定。
感谢您的帮助,谢谢

这是因为
i
-循环有一个固定的限制。在我看来,说它是O(N^2)并没有错,但如果我们严格,那么复杂性就是O(N^2*log(N))

我们可以更正式地证明这一点:

首先,让我们去掉分析中的
i
-循环。
i
的值在
k
-循环中递增。当
N
较大时,
i
将在第一次迭代中大于
60
,因此
i
-循环将只执行一次迭代。为简单起见,假设
i
只是一个用
0
初始化的变量。现在代码是:

inti=0;
对于(intj=-1;j
如果我们非常严格,那么我们必须考虑不同的情况,
i
-循环执行不止一次,但只有当
N
很小时,这不是我们对大O感兴趣的。为了简单起见,让我们先忘掉
i
-循环

我们先看循环,然后说内部语句是常数。我们分开来看

我们可以看到循环的复杂性是O(N^2)

现在是语句:有趣的是打印语句。打印一个数字显然是一个数字一个数字地完成的(简单地说),所以它不是常数。数字的位数随数字的对数增长。有关详细信息,请参阅。最后一个语句是常量

现在我们需要(粗略地)看看这些数字。
i
的值增长为
N*N
j
的值增长为
N
。因此,第一次打印打印的数字会增长到
N*N*N
。第二次打印打印的数字增长到
N*N
。因此,内体具有复杂性O(log(N^3)+log(N^2)),也就是O(3log(N)+2log(N)),也就是O(5log(N))。常量因子在大O中被删除,因此最终的复杂性是O(log(N))

将循环的复杂性和执行体的复杂性结合起来,得到总体复杂性:O(N^2*log(N))


询问您的老师是否应该考虑打印语句。

这是因为
i
-循环有一个固定的限制。在我看来,说它是O(N^2)并没有错,但如果我们严格,那么复杂性就是O(N^2*log(N))

我们可以更正式地证明这一点:

首先,让我们去掉分析中的
i
-循环。
i
的值在
k
-循环中递增。当
N
较大时,
i
将在第一次迭代中大于
60
,因此
i
-循环将只执行一次迭代。为简单起见,假设
i
只是一个用
0
初始化的变量。现在代码是:

inti=0;
对于(intj=-1;j
如果我们非常严格,那么我们必须考虑不同的情况,
i
-循环执行不止一次,但只有当
N
很小时,这不是我们对大O感兴趣的。为了简单起见,让我们先忘掉
i
-循环

我们先看循环,然后说内部语句是常数。我们分开来看

我们可以看到循环的复杂性是O(N^2)

现在是语句:有趣的是打印语句。打印一个数字显然是一个数字一个数字地完成的(简单地说),所以它不是常数。数字的位数随数字的对数增长。有关详细信息,请参阅。最后一个语句是常量

现在我们需要(粗略地)看看这些数字。
i
的值增长为
N*N
j
的值增长为
N
。因此,第一次打印打印的数字会增长到
N*N*N
。第二次打印打印的数字增长到
N*N
。因此,内体具有复杂性O(log(N^3)+log(N^2)),也就是O(3log(N)+2log(N)),也就是O(5log(N))。常量因子在大O中被删除,因此最终的复杂性是O(log(N))

将循环的复杂性和执行体的复杂性结合起来,得到总体复杂性:O(N^2*log(N))

询问你的老师是否应该考虑打印语句。

答案是O(N^2 log N)

首先,外部循环可以忽略,因为它有一个恒定的迭代次数,因此只由一个恒定的因子贡献。而且,
i=i+1
对时间复杂度没有影响,因为它只操纵外部循环

println(i*j)
语句的时间复杂度为
O(bitlength(i*j))
,它以
O(bitlength(N^2))=O(logn^2)=O(logn)
为界(对于另一个
println
语句也是如此)。现在,这些
println
语句执行的频率是多少

这两个内部循环是嵌套的,并且都从一个常数运行到
N
中的线性部分,因此它们迭代
O(N^2)
次。因此总时间复杂度为