def permutation(str): #str = string input
if len(str) == 0:
return [""]
result = []
for i, char in enumerate(str):
for p in permutation(str[:i] + str[i + 1 :]):
result.append(char + p)
return result
I am confused in asymptotic analysis (time complexity) in this code does it have an O(n!) or O(n*n!) because the recursive call is in the loop. I am still confused does the big O notation only based on regular notation like logarithmic, linear, quadratic, exponential, factorial, etc. Or could beyond that like a combination not only based on the regular notation
I already tried to calculate it and see some explanation in youtube but still couldn't understand well.
Let the time complexity of the function be T(n), where n is the length of the input string.
For the case where n is not 0, we need to consider the following parts:
For the outer loop, it needs to be repeated n times.
For the outer loop body, the time complexity of each recursive call is T(n - 1). (I omitted the O(n) time complexity of constructing the input, considering that T(n - 1) is at least (n - 1)!, which should not affect the results.)
For inner loop, since the output size of the permutation is n!, it needs to be repeated (n - 1)! times (the input length for recursive calls is n - 1).
For the inner loop body, due to the length of p being n - 1, the time complexity of char + p is O(n).
In summary, we can conclude that:
T(n) = n * (T(n - 1) + O(n) * (n - 1)!)
= n * T(n - 1) + n * O(n!)
= n * ((n - 1) * T(n - 2) + (n - 1) * O((n - 1)!)) + n * O(n!)
= n * (n - 1) * T(n - 2) + (n - 1) * O(n!) + n * O(n!)
...
= n! * T(0) + 1 * O(n!) + 2 * O(n!) + ... + n * O(n!)
= O(n!) + (1 + 2 + ... + n) * O(n!)
= O((1/2 * n**2 + 1/2 * n + 1) * n!)
= O(n**2 * n!)
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