Home > Software engineering >  Why is the time complexity for this O(n)?
Why is the time complexity for this O(n)?

Time:02-26

I am looking at this question:

Let T(n) be the maximum stack depth of the following function, in terms of n.

double foo (int n)
{
    int i;
    double sum;
    if (n == 0) 
        return 1.0;
    else {
        sum = 0.0;
        for (i = 0; i < n; i  )
            sum  = foo (i);
        return sum;
    }
}

Find T(n) = O(?)

The answer provided is O(n), but I calculated to be O(n!). I am not sure how to devise a solution for this.

CodePudding user response:

Stack depth can be expressed as the maximum number of recursive calls down from a single recursion at some point. foo(n) calls foo(0), foo(1),foo(2),..., foo(n - 1). If you trace recursive calls from foo(n-1), you'll see it calls foo(n - 2). It goes like this until f(0) is called. Therefore maximum stack depth is O(n). It's not O(n!).

What about time complexity?

T(n) = T(n-1)   T(n-2)   ...   T(1)   T(0)
T(1) calls T(0) 1 times.  (2^0)
T(2) calls T(0) 2 times.  (2^1)
T(3) calls T(0) 4 times. (from T(2)   T(1)   T(0))
T(4) calls T(0) 8 times.
T(5) calls T(0) 16 times. (2^4)
         ...
T(n-1) calls T(0) 2^(n-2) times.

In total T(0) is called [1   2   4   8   ...   2^(n-2)]   1 times.

It is equal to 2^(n-2) 2^(n-2), which can be expressed as 2^n / 2. Therefore it has exponential time complexity, that is O(2^n).

  • Related