【发布时间】:2013-12-18 11:13:45
【问题描述】:
我正在尝试生成 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 排列?
【问题讨论】:
-
什么是
next_combination?代码的有效性很大程度上取决于此函数的有效性。 -
很好的家庭作业问题,谢谢!
-
我在网上找到了能正确地从 n 中生成所有大小为 k 的组合(子集)的函数。
-
您应该知道,您尝试打印的枚举列表具有阶乘时间复杂度。您正在查看的 N 和 K 的大小是多少?
-
@IvayloStrandjev 这是一个标准库函数(对于 OP 的问题,它是错误的)。
标签: c++ algorithm permutation