为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉风的咖菲猫 2022-06-04 16:56:31
所以我在课堂上写了一个嵌套的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);}}第二个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);}}为什么第二个跑得更快?输出“z”是相同的。
查看完整描述

2 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

我相信这段代码有很多问题。


首先,不需要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总共运行迭代。


我也相信现在第 1 点变得更加清晰。


最后,您的第二个代码在两个不同方面不等同于此:


正如所指出的,你永远不会重置,y所以在第一次内部运行循环运行后它永远不会再次运行


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


您的第二个代码实际上与


for(int x = 0, y = 0; y <= n && x <= n; x++, y++) {

    z = x * y;

}

这段代码显然只需要运行n几次,而不是n*n要快得多。


查看完整回答
反对 回复 2022-06-04
?
墨色风雨

TA贡献1853条经验 获得超6个赞

在第一个循环中,y总是将值分配给zeroevery iteration,这使得它需要更多的时间和步骤才能达到n,而在第二个循环中,y不会重置为,zero因此它可以更快地达到 n 并且步骤更少。


循环1


while (x <= n) {

        int y = 0;

循环2


 while (x <= n) {

        while (y <= n) {

            z = x * y;

            x++;

            y++;    

        }


查看完整回答
反对 回复 2022-06-04
  • 2 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信