2

I can not guess the Big-O notation for this loops.

for (int j = 2; j < N; j++) {
    for (int k = 2*j; k <= N; k += j) {
        nums[k] = false;
    }
}

How to calculate the algorithm complexity for this loop?

David Zhang
  • 23
  • 1
  • 6

2 Answers2

5

The trick for this is Calculus to replace a sum by an integral that we understand.

for y from 2 to N:
    do roughly N/j things

So we have a sum of:

N/2 + N/3 + N/4 + ... + N/N
    = N (1/2 + 1/3 + 1/4 + ... + 1/N)

And that sum can be approximated with the integral from 1 to N of 1/x. Whose integral is log(x). So, modulo errors, it requires O(N log(N)) steps.

I waved my hands vigorously. But I assure you that the rigorous details can be filled in, and "replace sum by approximate integral" has a O(1) error.

btilly
  • 43,296
  • 3
  • 59
  • 88
1
for (int j = 2; j < N; j++) {  ==> it runs for "N-2" times
  for (int k = 2*j; k <= N; k += j) {
      nums[k] = false;
  }
}

for inner loop, let 'h' be no. of times inner loop has been called

   if j = 2 ==> values of k are 4,6,8,12,.....,2h ==> 2(2),3(2),....,h(2)
      j = 3 ==> values of k are 6,9,12,15,.....,3h ==> 3(2),3(3),....,h(3)
      :
      :
      j = N-1 ==> values of k are 2(N-1),3(N-1),4(N-1).......h(N-1)
 
here, inner loop stops when value of k > N

      => last time loop called will be for k < N or k = N
      => h(N-1) = N
      => h = N/N-1 => no of times inner loop is called

T(N) = (N-2) * (N/N-1) = O(N^2);