I'm working on a data structures course and I'm not sure how to proceed w/ this Big O analysis:
sum = 0; for(i = 1; i < n; i++) for(j = 1; j < i*i; j++) if(j % i == 0) for(k = 0; k < j; k++) sum++;
My initial idea is that this is O(n^3) after reduction, because the innermost loop will only run when j
/i
has no remainder and the multiplication rule is inapplicable. Is my reasoning correct here?
Big-Ο is used as a tight upper bound on the growth of an algorithm's effort (this effort is described by the function f(n)), even though, as written, it can also be a loose upper bound. “Little-ο” (ο()) notation is used to describe an upper bound that cannot be tight.
Big O notation is used to describe the complexity of an algorithm when measuring its efficiency, which in this case means how well the algorithm scales with the size of the dataset.
Let's ignore the outer loop for a second here, and let's analyze it in terms of i
.
The mid loop runs i^2
times, and is invoking the inner loop whenever j%i == 0
, that means you run it on i, 2i, 3i, ...,i^2
, and at each time you run until the relevant j
, this means that the inner loop summation of running time is:
i + 2i + 3i + ... + (i-1)*i = i(1 + 2 + ... + i-1) = i* [i*(i-1)/2]
The last equality comes from sum of arithmetic progression.
The above is in O(i^3)
.
repeat this to the outer loop which runs from 1
to n
and you will get running time of O(n^4)
, since you actually have:
C*1^3 + C*2^3 + ... + C*(n-1)^3 = C*(1^3 + 2^3 + ... + (n-1)^3) = = C/4 * (n^4 - 2n^3 + n^2)
The last equation comes from sum of cubes
And the above is in O(n^4)
, which is your complexity.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With