C ++中的k排列

k permutation in c++

本文关键字:排列 中的      更新时间:2023-10-16

我正在尝试生成 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 排列?

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 );
  }
}