嵌套for循环打印多少次' y'?

时间:2015-03-09 21:44:15

标签: java

我一直在看这个例子一段时间而且我被卡住了,我的问题是声明的次数:

System.out.println(y);

将在以下代码中执行:

for(int x=0;x<N;x++){
  for(int y=x;y<N;y++){
    System.out.println(y);
  }
}

我原以为它肯定会打印N + N-1 + N-2(...)次? 我们正在研究Big-O的复杂性,但我现在正在努力解决这个问题。

3 个答案:

答案 0 :(得分:2)

是的,N + (N - 1) + (N - 2) + ...

反过来说,它显然是来自1 .. N的数字的总和,它具有众所周知的0.5 * N * (N + 1)解决方案,也可以写为0.5 * (N^2 + N)

由于N^2术语在Big-O表示法中占主导地位,因此将其视为O(N^2),并忽略0.5常量因子。

答案 1 :(得分:2)

我的第一个建议是测试它 - 它是代码,它意味着要运行!

public static void runMe(int N) {
    int counter = 0;
    for(int x=0;x<N;x++){
      for(int y=x;y<N;y++){
        counter ++; // replacing the print
      }
    }
    System.out.println(counter);
}

您将看到以下值:

N counter
----------
0: 0
1: 1
2: 3
3: 6
4: 10
5: 15
6: 21
7: 28
8: 36
9: 45
10: 55

你可以看到这对应于(N + 1)* N / 2 =从i = 1到N的i之和。但是有一种更好的几何方式来看待它。让我们用星号代替数字:

public static void runMe(int N) {
    int counter = 0;
    for(int x=0;x<N;x++){
      for(int y=x;y<N;y++){
        System.out.print("*");
      }
      System.out.println();
    }
}

对于N = 8,结果是

********
*******
******
*****
****
***
**
*

三角形,底边8和高度8.三角形的面积是底边x高度/ 2. 8 * 9/2 = 4 * 9 = 36(接受+1高度或宽度来修复圆角:它毕竟不是一个完美的光滑三角形)。获胜的几何形状!

如果你还记得三角形区域的几何解释,那么它也在这里(它解释了+1):让我们的三角形切割折叠:

********/*
*******/**
******/***
*****/****

你有:甚至N,你切下三角形,旋转它,它会很好地适应上三角形。 N / 2行中的每一行上的N + 1 =(N + 1)* N / 2

对于奇数N,您可以保持第一行不变:这是N = 7

的输出
*******
******
*****
****
***
**
*
折叠后:(N + 1)/ 2 * N =(N * 1)* N / 2 = 28

*******/
******/*
*****/**
****/***

答案 2 :(得分:0)

答案将在恰好1 / 2N(N + 1)行上打印出1 / 2N(N + 1)次的答案。

例如,对于1,它将打印1次。对于两个,它将打印3次,对于3,它将打印6次。

模式为:1,3,6,10,15,21,28,该模式将始终匹配

 F(x) = 1/2 x N x (N+1)

希望这有帮助