我一直试图弄清楚如何获得这个for循环的解决方案,但我似乎无法理解为什么答案就是这样。我被困在内部for循环中,有人可以帮助我逐步分解它并得到第二个for循环的答案,第2行。这是为了回顾不是家庭作业。我只是想更好地理解这个概念。
1: for (int i = 0; i < n; i++) { // Runs n+1 times
2: for (int j = n; j >= i; j--) { // Runs (n+2)+(n+1)+ n(n+1)/2 - 3 times
3: cout << i << “,” << j <<endl; // Runs (n+1) + n(n+1)/2 - 1 times
4: }
5: }
我知道第二行被简化为n(n + 1)/ 2 + 2n,但我不明白如何得到(n + 2)+(n + 1)+ n(n + 1)/首先是2 - 3。
答案 0 :(得分:1)
1: for (int i = 0; i < n; i++) { // Runs n+1 times
此行不会运行n + 1次。因为它是i < n
它运行n
次。
2: for (int j = n; j >= i; j--) {
这一行的运行时间为n - i + 1
次。因为它使用>=
进行比较。
因此,如果我们记下cout
的执行情况,我们会得到类似的结果:
1: n+1
2: n
3: n-1
...
...
n: 1
所以我们需要做的只是添加最多n+1
是(n+1)(n+2)/2
希望这会有所帮助
答案 1 :(得分:0)
for (int i = 0; i < n; i++) {
for (int j = n; j >= i; j--) {
cout << "something" << endl;
}
}
让我们看看i
的值,内循环的运行次数。
i=0 --> n
i=1 --> n-1
i=2 --> n-2
i=3 --> n-3
...
...
i=n-1 --> 1
让我们将每个元素增加到n
以获得上限
1 + 2 + 3 + .... + n-1 + n&lt; [n + n + n + .... + n] = O(n ^ 2)
让我们抛出一半的第一个元素,另一半将它减少到n/2
。下限。
1 + 2 + 3 + .... + n-1 + n&gt; [n / 2 + n / 2 + ... + n / 2] =(n / 2)*(n / 2)=(n ^ 2)/ 4 =Ω(n ^ 2)
下限和上限是Ω(n), O(n)
,我们可以推断它实际上是ϴ(n)
。
我们可以立即注意到它实际上是一个算术序列。
1 + 2 + 3 + ... + n = (1+n)*(n-1)/2 = ϴ(n^2)