C ++中的k排列
k permutation in c++
我正在尝试生成 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 );
}
}
相关文章:
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- 如何在 c++ 中按字母顺序排列数组中的字符串?
- 如何用单词排列向量中的每个字符升序?
- 使用指针重新排列数组中的数字
- 给定一个包含 n 个整数和一个整数 x 的未排序数组 A,重新排列 A 中的元素
- 排列 2D 数组中的元素
- 像素在 SDL2 中的排列方式
- 如何通过C 中的另一个索引来重新排列数组
- 已知格式化文件中的数据排列
- C ++中的k排列
- 跳过C++中的排列元素
- 成员变量的更新值不会在 PTHREAD 中的线程路由函数中重新排列
- 对 C++ 中的数组执行随机排列
- 过滤掉仅与字典中的单词匹配的排列
- 如何让我的函数只能从排列中找到现实世界
- 在 c++ 中使用 next_permutation() stl 的两个数组中的相同排列
- c++中生成排列中的递归问题
- 有效地计算随机排列中的第n项
- 排列中的交换数
- 排列中的升序子序列