Nested for loop in Big Oh Complexity

后端 未结 3 622
南方客
南方客 2021-01-21 10:17
for(int i = 0; i < n; i++) {
    for(int j = 0; j < i; j++){
        //do swap stuff, constant time
    }
}

I read that single for loop is O(N) a

相关标签:
3条回答
  • 2021-01-21 10:46

    You need to use the ancient and obscure art of mathematics and calculate the number of times that the inner statement is executed.

    In your case, the inner loop is executed i times. The values for i are 0, 1, 2, ..., n-1. So you need a formula that calculates this sum, and that's your result.

    You read that a single loop is O (n). That's nonsense. It depends on the loop.

    for (i = 1; i < n; i *= n)
    

    doesn't iterate n times. It iterates log2 (n) times, which is usually an awful lot less. You need to look at the actual code and figure it out. There is no simple rule for this.

    0 讨论(0)
  • 2021-01-21 11:01

    A function that loops from i = 1 to n and then has a inner loop that goes from 1 to i would go though a number of iteration equal to this formula:

    n(n+1)/2

    As you can see, when we get rid of everything besides the main exponent, you end with O(n^2)

    0 讨论(0)
  • 2021-01-21 11:07

    As you mentioned

    Each takes unit of 1 - O(1)

    So each iteration of the inner loop takes 1, 2, 3, ... , n unit time.

    total_time = 1 +   2   +   3   + ... + (n-2) + (n-1) + n
    

    Reversing

    total_time = n + (n-1) + (n-2) + ... +   3   +   2   + 1
    

    Adding

    2 * total_time = (n+1) + (n+1) + (n+1) + ... + (n+1) + (n+1) + (n+1)
    

    There are total n terms

    2 * total_time = (n+1) * n
    
    => total_time = (n+1) * n / 2
    
    => total_time = n^2 / 2 + n / 2
    

    Lower terms and constant coefficients are neglected for big O complexity.

    As a result

    O(n^2)

    0 讨论(0)
提交回复
热议问题