newprint
newprint

Reputation: 7136

Running time of for loop - part #2

This would be part # 2 of my question about analysis of for loop running time

http://faculty.simpson.edu/lydia.sinapova/www/cmsc250/LN250_Weiss/L03-BigOhSolutions.htm#PR4 contains solutions, and I have question about two particular "for" loops

Could someone explain to me how to figure out running time for both of them. Thanks !

1.

sum = 0;
for( i = 0; i < n; i++)
    for( j = 0; j < i*i; j++)
        for( k = 0; k < j; k++)
            sum++;  

2.

sum = 0;
for( i = 0; i < n; i++)
    for( j = 0; j < i*i; j++)
        if (j % i ==0)
           for( k = 0; k < j; k++)
               sum++;

Upvotes: 1

Views: 2331

Answers (2)

Mysticial
Mysticial

Reputation: 471299

The first snippet is O(n^5).

Top Loop    = 0 - O(n)   = O(n)   iterations
Middle Loop = 0 - O(n^2) = O(n^2) iterations
Inner Loop  = 0 - O(n^2) = O(n^2) iterations

Total = O(n^5)

Here's the closed-form solution of the first snippet: (computed via Mathematica)

sum = -(1/10)*n + (1/4)*n^2 - (1/4)*n^4 + (1/10)*n^5

This is a 5th order polynomial, therefore it is: O(n^5)

The second snippet appears to be O(n^4).

Top Loop    = 0 - O(n)   = O(n) iterations
Middle Loop = 0 - O(n^2) = O(n^2) iterations
If statement enters: O(1 / n) times
Inner Loop  = 0 - O(n^2) = O(n^2) iterations

Total = O(n^4)

Here's the closed-form solution of the second snippet: (computed via Mathematica)

sum = -(1/12)*n + (3/8)*n^2 - (5/12)*n^3 + (1/8)*n^4

This is a 4th order polynomial, therefore it is: O(n^4)

Further explanation of the effect of the if-statement:

The middle loop iterates from 0 to i*i. The if-statement checks if j is divisible by i. But that is only possible when j is a multiple of i.

How many times is j a multiple of i if 0 <= j < i*i? Exactly i times. Therefore only 1/i of the iterations of the middle loop will fall through to the inner-most loop.

Upvotes: 2

Nathan
Nathan

Reputation: 1520

The relationship of 'n' as well as the other variables in the second for loop statement ( ..., x<=n, ...) would really define how fast it would be. Try to visualize a for loop as a racem and the second statement says how many laps you would make. So for example, variable 'n' = 1000, then you would have to run the same lap for 1000 times, truly time wasting. Hope that got you a better view on things.

Upvotes: 1

Related Questions