我知道一般情况的算法(例如生成所有组合 n个元素一次采取m)但我想知道是否有一个更快的具体 为m = n-1的情况设计。此外,如果存在这样的算法,任何人都可以指出 C / C ++实现?
答案 0 :(得分:4)
非常简单 - 使用简单的循环迭代所有元素。在这个循环中构造一个新的集合,包括除了一个之外的所有元素(循环中由索引指向的元素)。
注意:一些注意事项,以便您可以实现O(N)
复杂性(例如,我将使用C++
,但您可以使用任何其他语言与类似矢量的容器。)
在C++
中:假设您拥有一个包含所有数字的vector<int> a
:
vector<int> a;
... initialize a ....
vector<int> b(a.begin()+1, a.size()); // Now b will have all elements of a but the first one.
for (int i=0;i<a.size() - 1;++i) {
b.push_back(a[i]);
swap(b[i], b[b.size()-1]);
b.pop_back();
}
使用上面的代码b将连续迭代所有组合。
答案 1 :(得分:0)
如果一个集合
所以我认为可以使用2个循环实现上面的设置
也在组合
中设U是一个包含n个元素的集合;我们想要计算具有正好j个元素的集合U的不同子集的数量。这可以写成N!/ J! *(N-J)!
注意:可以删除空元素子集,公式变为2 ^ n-1
这是我的答案,如果有所帮助
希望这有帮助!!!