Today in class my teacher wrote on the blackboard this recursive factorial algorithm:
int factorial(int n) { if (n == 1) return 1; else return n * factorial(n-1); }
She said that it has a cost of T(n-1) + 1
.
Then with iteration method she said that T(n-1) = T(n-2) + 2 = T(n-3) + 3 ... T(n-j) + j
, so the algorithm stops when n - j = 1
, so j = n - 1
.
After that, she substituted j
in T(n-j) + j
, and obtained T(1) + n-1
.
She directly said that for that n-1 = 2(log2n-1), so the cost of the algorithm is exponential.
I really lost the last two steps. Can someone please explain them to me?
For the time complexity of the iterative solution, you have n multiplications in the for loop, so a loose bound will be O(n) . Every other operation can be assumed to be unit time or constant time, with no bearing on the overall efficiency of the algorithm.
To conclude, space complexity of recursive algorithm is proportinal to maximum depth of recursion tree generated. If each function call of recursive algorithm takes O(m) space and if the maximum depth of recursion tree is 'n' then space complexity of recursive algorithm would be O(nm).
A recursive function is a nonleaf function that calls itself. The factorial function can be written as a recursive function call. Recall that factorial(n) = n × (n – 1) × (n – 2) × … × 2 × 1. The factorial function can be rewritten recursively as factorial(n) = n × factorial(n – 1).
Let's start off with the analysis of this algorithm. We can write a recurrence relation for the total amount of work done. As a base case, you do one unit of work when the algorithm is run on an input of size 1, so
T(1) = 1
For an input of size n + 1, your algorithm does one unit of work within the function itself, then makes a call to the same function on an input of size n. Therefore
T(n + 1) = T(n) + 1
If you expand out the terms of the recurrence, you get that
So in general this algorithm will require n units of work to complete (i.e. T(n) = n).
The next thing your teacher said was that
T(n) = n = 2log2 n
This statement is true, because 2log2x = x for any nonzero x, since exponentiation and logarithms are inverse operations of one another.
So the question is: is this polynomial time or exponential time? I'd classify this as pseudopolynomial time. If you treat the input x as a number, then the runtime is indeed a polynomial in x. However, polynomial time is formally defined such that the runtime of the algorithm must be a polynomial with respect to the number of bits used to specify the input to the problem. Here, the number x can be specified in only Θ(log x) bits, so the runtime of 2log x is technically considered exponential time. I wrote about this as length in this earlier answer, and I'd recommend looking at it for a more thorough explanation.
Hope this helps!
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