为什么一个嵌套的while循环比另一个嵌套的while循环快?

时间:2019-02-03 20:04:48

标签: java algorithm

所以我在课堂上写了一个嵌套的while循环来计算z的值。我需要同时输出z和花费的时间。

这是结果

public class TimeWhile {

public static void main(String[] args) {
    int n = 100000;
    int z = 1;
    long startTime = System.currentTimeMillis();

    int x = 0;
    while (x <= n) {
        int y = 0;
        while (y <= n) {
            z = x * y;
            y++;
        }
        x++;
    }
    long endTime = System.currentTimeMillis();
    long elapsed = endTime - startTime;
    System.out.println("The time is " + elapsed);
    System.out.println("The number is " + z);

}

}

enter image description here

第二次while循环

public class TimeWhile {

public static void main(String[] args) {
    int n = 100000;
    int z = 1;
    long startTime = System.currentTimeMillis();

    int x = 0;
    int y = 0;
    while (x <= n) {
        while (y <= n) {
            z = x * y;
            x++;
            y++;    
        }
    }
    long endTime = System.currentTimeMillis();
    long elapsed = endTime - startTime;
    System.out.println("The time is " + elapsed);
    System.out.println("The number is " + z);

}

}

enter image description here

为什么第二个运行得更快?输出“ z”相同。

3 个答案:

答案 0 :(得分:2)

在第一个循环中,y的值始终分配给每个zero上的iteration,从而在第二个循环中将花费更多的时间和步骤来达到n循环,y不会重置为zero,因此到达n的速度更快,步数也更少。

loop1

while (x <= n) {
        int y = 0;

loop2

 while (x <= n) {
        while (y <= n) {
            z = x * y;
            x++;
            y++;    
        }

答案 1 :(得分:2)

我相信此代码有很多错误之处。

首先,每次循环时都不需要计算z = x * y,但是最后一次迭代将覆盖该值。因此,您的代码实际上与以下代码相同:

heatTheUniverseForSomeTime();
int z = n*n;

这意味着z的输出相同的事实实际上并不意味着循环的工作原理。

第二,int的类型不足以容纳100000*100000的值。这就是为什么您拥有1410065408而不是更多期望的10000000000的原因。 long会有所帮助(但请注意,您也应该在右侧向long至少投射一个参数!)。如果您需要更大的值,请考虑使用BigInteger

第三点是,您可以通过使用for循环来以更常见,更易理解的形式重写您的第一个示例,如下所示:

for(int x = 0; x <= n; x++) {
    for(int y = 0; y <= n; y++) {
        z = x * y;
    }
}

此代码显然总共需要运行n*n个迭代。

我还相信现在第一点变得更加清晰。

最后,您的第二个代码在2个不同方面并不等效:

  • 如前所述,您永远不会重置y,因此在第一次内部运行循环运行之后,它再也不会运行

  • 此外,由于您也在内部循环中执行x++;,这意味着它始终持有x == y,因此外部循环也不会在第一次迭代后运行。

您的第二个代码实际上与

相同
for(int x = 0, y = 0; y <= n && x <= n; x++, y++) {
    z = x * y;
}

此代码显然只需要运行n次,而不是n*n,运行速度要快得多。

答案 2 :(得分:1)

第二个要快得多,因为您在嵌套的while循环中而不是在外部的while循环中增加x。嵌套的while循环比外部循环运行更多次,因为它将一直重复直到外部循环的条件为false为止。如果将x放在嵌套循环中,它将连续重复多次,使外循环的条件错误更快。