Time complexity of a recursive algorithm

algorithm, c, time-complexity

Solution

Analyzing recursive functions (or even evaluating them) is a nontrivial task. A (in my opinion) good introduction can be found in Don Knuths Concrete Mathematics.

However, let's analyse these examples now:

We define a function that gives us the time needed by a function. Let's say that `t(n)` denotes the time needed by `pow(x,n)`, i.e. a function of `n`.

Then we can conclude, that `t(0)=c`, because if we call `pow(x,0)`, we have to check whether (`n==0`), and then return 1, which can be done in constant time (hence the constant `c`).

Now we consider the other case: `n>0`. Here we obtain `t(n) = d + t(n-1)`. That's because we have again to check `n==1`, compute `pow(x, n-1`, hence (`t(n-1)`), and multiply the result by `x`. Checking and multiplying can be done in constant time (constant `d`), the recursive calculation of `pow` needs `t(n-1)`.

Now we can "expand" the term `t(n)`:

t(n) =
d + t(n-1) = 
d + (d + t(n-2)) = 
d + d + t(n-2) = 
d + d + d + t(n-3) =
... =
d + d + d + ... + t(1) =
d + d + d + ... + c

So, how long does it take until we reach `t(1)`? Since we start at `t(n)` and we subtract 1 in each step, it takes `n-1` steps to reach `t(n-(n-1)) = t(1)`. That, on the other hands, means, that we get `n-1` times the constant `d`, and `t(1)` is evaluated to `c`.

So we obtain:

t(n) =
...
d + d + d + ... + c =
(n-1) * d + c

So we get that `t(n)=(n-1) * d + c` which is element of O(n).

`pow2` can be done using Masters theorem. Since we can assume that time functions for algorithms are monotonically increasing. So now we have the time `t(n)` needed for the computation of `pow2(x,n)`:

t(0) = c (since constant time needed for computation of pow(x,0))

for `n>0` we get

        / t((n-1)/2) + d if n is odd  (d is constant cost)
t(n) = <
        \ t(n/2) + d     if n is even (d is constant cost)

The above can be "simplified" to:

t(n) = floor(t(n/2)) + d <= t(n/2) + d (since t is monotonically increasing)

So we obtain `t(n) <= t(n/2) + d`, which can be solved using the masters theorem to `t(n) = O(log n)` (see section Application to Popular Algorithms in the wikipedia link, example "Binary Search").

Problem

How can I calculate the time complexity of a recursive algorithm? ``` int pow1(int x,int n) { if(n==0){ return 1; } else{ return x * pow1(x, n-1); } } int pow2(int x,int n) { if(n==0){ return 1; } else if(n&1){ int p = pow2(x, (n-1)/2) return x * p * p; } else { int p = pow2(x, n/2) return p * p; } } ```

Original source