据我所知,std::next_permutation
算法在 O(n!)时间内运行。谁能解释为什么会这样?或者如果我对它是对的吗?
以下是我运行它的代码,尝试计算排列的数量,直到给定的数组n
已经排序:
int permutationSort(int a[], int n)
{
int count = 0;
while (next_permutation(a, a + n))
{
count++;
}
return count;
}
答案 0 :(得分:3)
在最坏的情况下,将排列转换为字典顺序中的下一个排列的std::next_permutation
的复杂性为O(n)
。
n
个不同元素的排列数为n!
。 permutations of multisets的数量为n!/(n1!*n2!*...*nk!)
,其中ni
是i
类型的相等元素的数量。
我们有两种不同的情况:
不同的数字(设定)。
当所有元素都不同时, next_permutation
通常(如果不是总是)以O(1)
摊销时间实施。后者意味着next_permutation
因此会多次调用O(1)
平均时间。
在这种情况下,permutationSort
函数的复杂性在最坏的情况下为O(n!)
,因为n!
循环迭代与O(1)
的{{1}}调用next_permutation
1}}。
重复的数字(multiset)
在这种情况下,next_permutation
没有保证O(1)
摊销的复杂性,但多重集合的排列数量很多。可能比n!
小得多。在最坏的情况下,permutationSort
函数复杂度的上限是O(n!*n)
。我想它可以缩减为O(n!)
,但不知道如何证明这一事实。
答案 1 :(得分:1)
您的示例不衡量std::next_permutation
的工作情况。它仅测量您调用它的次数。你做有O(n!)来电到std::next_permutation
。
您必须查看reference才能找到您没有源代码的复杂代码。或者,您可以构建一个计算掉期和比较的类型,以获得复杂性的经验度量。这不是分析,但它提供了类似的信息。