0

First of all, I know there are many questions like this on the site. But I think this case is a bit different.

Consider the following code:

int i, j, k;

for (i = 1; i <= n; i++){   
    for (j = 1; j <= (n-i); j++) {
        System.out.print(" ");
    }

    for (k = 1; k <= (i-j); k++) {
        System.out.print(i);
    }

    System.out.println();
}

What would be the time complexity of this code? It seems like O(n^2) to me but I can't justify it properly.

How our professor told us to compute complexity is just by adding all the summations together from every line.

$$ (n+1) + \sum_{j=1}^{N-i} + \sum_{j=1}^{N-i} + \sum_{k=1}^{i-j} + \sum_{k=1}^{i-j} + n $$

However, I've never seen examples with summations like $\sum_{j=1}^{N-i}$, It's always either $\sum_{j=1}^{N-1}$ or some constant number being subtracted from N, which is easier to sum. So, How would I solve this? And is it O(n^2)?

Raphael
  • 73,212
  • 30
  • 182
  • 400
candh
  • 109
  • 4

3 Answers3

0

The number of print statements executed is $$ \sum_{i=1}^n \left[ \left(\sum_{j=1}^{n-i} 1\right) + \left(\sum_{k=1}^{i-(n-i+1)} 1\right) + 1 \right], $$ where the second sum is zero if $1 > i-(n-i+1)$.

The running time is proportional to the number of print statements, so it remains to compute the value of the expression above, or at least to give a good estimate. This I leave to you.

Yuval Filmus
  • 280,205
  • 27
  • 317
  • 514
0

For better analysis the code, you can rewrite loop that use variable $k$ in terms of $n,i$ not $j$:

  int i, j, k;
for (i = 1; i &lt;= n; i++){   
    for (j = 1; j &lt;= (n-i); j++) {
        System.out.print(&quot; &quot;);
    }

    for (k = 1; k &lt;= (i-(n-i+1)); k++) {
        System.out.print(i);
    }

    System.out.println();
}

Let $T(n)$ be time complexity of code. Therefore our code have two disjoint inner loop that displayed by the following summation (suppose each operation System.out.print need constant time, notice that, the inner loop with variable $j$ has the cost $(n-1)+(n-2)+\dots+1=\sum_{i=1}^{n-1}i$), so:

$$T(n)=\sum_{i=1}^{n-1}i+\sum_{i=1}^{n}\left(\sum_{k=1}^{i-n+i-1}\mathcal{O}(1)\right)$$ $$=\sum_{i=1}^{n-1}i+\sum_{i=1}^{n}\left(\sum_{k=1}^{2i-n-1}\mathcal{O}(1)\right)$$ $$=\sum_{i=1}^{n-1}i+\sum_{i=1}^{n}(2i-n-1)=\Theta(n^2)+\mathcal{O}(n^2)$$ $$=\Theta(n^2)$$

ErroR
  • 1,954
  • 6
  • 22
0

Let us work out an example with $n=5$.

The outer loop is executed with $i=1,2,3,4,5$. Thus the first inner loop executes $4+3+2+1+0$ print's. And the second inner loop $0+0+0+2+4$ print's.

For $n=6$, we have $5+4+3+2+1+0$ print's. And the second inner loop $0+0+0+1+3+5$ print's.

We can easily generalize and get the counts $n$ (outer), $\dfrac{(n-1)n}2$ (first inner) and $\dfrac{n^2-1}4$ or $\dfrac{n^2}4$ depending on the parity of $n$ (second inner).