是否存在用于生成n个元素的所有组合的特定算法,一次取n-1

时间:2013-03-15 11:43:26

标签: algorithm language-agnostic

我知道一般情况的算法(例如生成所有组合 n个元素一次采取m)但我想知道是否有一个更快的具体 为m = n-1的情况设计。此外,如果存在这样的算法,任何人都可以指出  C / C ++实现?

2 个答案:

答案 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个元素{1,2}子集将包含2 ^ 2个元素{},{1},{2},{1,2}
  • 3个元素{1,2,3}子集将有2 ^ 3个元素{}, {1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}
  • 4个元素{1,2,3,4}子集将有2 ^ 4个元素{}, {1},{2},{3},{4},{1,2},{1,3}, {1,4} {2,3},{2,4},{3,4},{1,2,3},{1,2,4},{1,3,4},{2, 3,4},{1,2,3,4}

所以我认为可以使用2个循环实现上面的设置

也在组合

设U是一个包含n个元素的集合;我们想要计算具有正好j个元素的集合U的不同子集的数量。这可以写成N!/ J! *(N-J)!

注意:可以删除空元素子集,公式变为2 ^ n-1

这是我的答案,如果有所帮助

  • 如果N = 2 {1},{2}
  • 对于N = 3,在N = 2个元素{1,3} {2,3}的末尾添加3并且混合N = 2 要素{1,2}
  • 对于N = 4,在N = 3个元素{1,3,4} {2,3,4} {1,2,4}的末尾添加4并且 混合N = 3个元素{1,2,3}

希望这有帮助!!!