内循环的时间复杂度

时间:2017-08-06 22:40:29

标签: time-complexity computer-science

我一直试图弄清楚如何获得这个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。

2 个答案:

答案 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)