next_permutation大O表示法的时间复杂度

时间:2017-09-29 09:08:54

标签: c++ algorithm

据我所知,std::next_permutation算法在 O(n!)时间内运行。谁能解释为什么会这样?或者如果我对它是对的吗?

以下是我运行它的代码,尝试计算排列的数量,直到给定的数组n已经排序:

int permutationSort(int a[], int n)
   {
      int count = 0;

      while (next_permutation(a, a + n))
      {
          count++;
      }

      return count;
   }

2 个答案:

答案 0 :(得分:3)

在最坏的情况下,将排列转换为字典顺序中的下一个排列的std::next_permutation的复杂性为O(n)

n个不同元素的排列数为n!permutations of multisets的数量为n!/(n1!*n2!*...*nk!),其中nii类型的相等元素的数量。

我们有两种不同的情况:

  1. 不同的数字(设定)。

    当所有元素都不同时,

    next_permutation通常(如果不是总是)以O(1)摊销时间实施。后者意味着next_permutation因此会多次调用O(1)平均时间。

    在这种情况下,permutationSort函数的复杂性在最坏的情况下为O(n!),因为n!循环迭代与O(1)的{​​{1}}调用next_permutation 1}}。

  2. 重复的数字(multiset)

    在这种情况下,next_permutation没有保证O(1)摊销的复杂性,但多重集合的排列数量很多。可能比n!小得多。在最坏的情况下,permutationSort函数复杂度的上限是O(n!*n)。我想它可以缩减为O(n!),但不知道如何证明这一事实。

答案 1 :(得分:1)

您的示例衡量std::next_permutation的工作情况。它仅测量您调用它的次数。你有O(n!)来电std::next_permutation

您必须查看reference才能找到您没有源代码的复杂代码。或者,您可以构建一个计算掉期和比较的类型,以获得复杂性的经验度量。这不是分析,但它提供了类似的信息。