Combination - 组合


问题

从包含个元素的集合中任意取个元素()组成组合,求所有组合。集合中任意两元素互不相同。

解法

设置集合表示集合的选择,表示选择数字表示不选择数字。比如集合中取出组合

等价于集合

即元素,元素

可以看出,包含个元素的集合中取出个元素的所有组合,可以转化为求有的集合的唯一全排列,其中

从集合中取出个元素作为组合,即中有,唯一全排列有

从集合中取出个元素作为组合。则中有,唯一全排列有

从集合中取出个元素作为组合,则中有,唯一全排列有个。

只要求出所有唯一全排列,即可反向求出对应的组合。

包含个元素中选出个元素的所有组合,需要重复次,每次求有的集合的唯一全排列,其中。根据全排列反向得到组合,算法结束。第步求唯一全排列的时间复杂度为,该算法的时间复杂度为

StackOverflow - algorithm-to-return-all-combinations-of-k-elements-from-n

二项式系数

Chase’s Twiddle - Algorithm 382: Combinations of M out of N Objects:

Buckles - Algorithm 515: Generation of a Vector from the Lexicographical Index:

Remark on algorithm 515: Generation of a vector from the lexicographical index combinations


源码

Combination.h

Combination.cpp

测试

CombinationTest.cpp