k ++中的k置换

时间:2013-12-18 11:13:45

标签: c++ algorithm permutation

我试图生成n个值的所有k个排列而不重复。 例如,3的2个值的排列: 1,2,3

答案是:

1,2

1,3

2,1

2,3

3,1

3,2

我目前正在使用STL的next_permutation()来生成所有排列。此外,我找到了一个生成大小为k的组合的代码。这是代码:

res = new vector<vector<int>>;

vector<int> a;

for(int i = 0; i < n; i++)
    a.push_back(i); 

do {
    vector<int> b;

    for(int i = 0; i < k; i++)
        b.push_back(a[i]);

    do {
        res->push_back(b);          
    } while(next_permutation(b.begin(), b.begin() + k));                

} while(next_combination(a.begin(), a.begin() + k, a.end()));

首先,函数找到一个新组合,然后使用next_permutation生成该特定子集的所有排列。

此代码非常耗时。我想知道是否有更好的库可以在c ++中产生k排列?

1 个答案:

答案 0 :(得分:1)

std :: next_permutation库函数以字典顺序生成排列。它的复杂性高达列表大小的一半。

您可以使用递归自行实现代码。由于这种组合的数量具有因子复杂性,因此这也是无效的。此外,您还有可能耗尽所有堆栈空间。

void recurCombinations( vector<int> &soFar, vector<int> &remaining, int K ) {
  if ( soFar.size() == K ) {
    output( soFar );
    return;
  }

  for ( int j = 0; j < remaining.size(); j++ ) {
    vector<int> newRemaining( remaining );
    vector<int> newSoFar( soFar );
    newSoFar.push_back( remaining[ j ] );
    newRemaining.erase( newRemaining.begin() + j );
    recurCombinations( newSoFar, newRemaining, K );
  }

}