我试图生成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排列?
答案 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 );
}
}