我一直在看这个例子一段时间而且我被卡住了,我的问题是声明的次数:
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的复杂性,但我现在正在努力解决这个问题。
答案 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)
希望这有帮助