【发布时间】:2020-04-05 08:03:51
【问题描述】:
我正在尝试获取一个函数来生成所有可能的数字组合,但我的问题是处理时间太长。所以我认为我必须优化它。 问题:生成所有具有 1 到 n 个元素的“r”大小集合,而不以相反的顺序重复(1,2 等于 2, 1)。
例子:
n = 3 //elements: 1,2,3
r = 2 //size of set
Output:
2 3
1 3
1 2
我使用的代码如下:
void func(int n, int r){
vector <vector <int>> reas;
vector<bool> v(n);
fill(v.end() - r, v.end(), true);
int a = 0;
do {
reas.emplace_back();
for (int i = 0; i < n; ++i) {
if (v[i]) {
reas[a].push_back(i+1);
}
}
a++;
} while (next_permutation(v.begin(), v.end()));
}
如果 n = 3 和 r = 2,输出将与上例相同。 我的问题是,如果我设置 n = 50 和 r = 5,则精化时间太长,我需要使用 n = 50...100 和 r= 1..5 的范围; 有没有办法优化这个功能?
非常感谢
【问题讨论】:
标签: c++ math optimization combinations