Reputation: 1131
From: Are there any better methods to do permutation of string?
what is the complexity of this function???
void permute(string elems, int mid, int end)
{
static int count;
if (mid == end) {
cout << ++count << " : " << elems << endl;
return ;
}
else {
for (int i = mid; i <= end; i++) {
swap(elems, mid, i);
permute(elems, mid + 1, end);
swap(elems, mid, i);
}
}
}
Upvotes: 20
Views: 23674
Reputation: 26586
Without looking too deeply at your code, I think I can say with reasonable confidence that its complexity is O(n!). This is because any efficient procedure to enumerate all permutations of n distinct elements will have to iterate over each permutation. There are n! permutations, so the algorithm has to be at least O(n!).
Edit:
This is actually O(n*n!). Thanks to @templatetypedef for pointing this out.
Upvotes: 8
Reputation:
Ignoring the print, the recurrence relation satisfied is
T(n) = n*T(n-1) + O(n)
If G(n) = T(n)/n!
we get
G(n) = G(n-1) + O(1/(n-1)!)
which gives G(n) = Theta(1)
.
Thus T(n) = Theta(n!)
.
Assuming that the print happens exactly n!
times, we get the time complexity as
Theta(n * n!)
Upvotes: 26
Reputation: 11098
long long O(int n)
{
if (n == 0)
return 1;
else
return 2 + n * O(n-1);
}
int main()
{
//do something
O(end - mid);
}
This will calculate complexity of the algorithm.
Actualy O(N) is N!!! = 1 * 3 * 6 * ... * 3N
Upvotes: 3