获取X元素列表时,如何获得所有双打,三元组,...(Y)这些元素的组合?
Y是所需组合的大小。例如:如果Y = 2,我需要得到所有可能的对
我不能两次给出相同的组合(例如:[a,b]和[b,a]是相同的组合)
答案 0 :(得分:2)
取一份清单。
如果列表为空,则没有组合。
要获得大小为1的所有组合,请依次查看每个元素。
要获得大小为n + 1的所有组合,请先删除第一个元素。然后得到列表其余部分的大小为n的所有组合,加上第一个元素。然后获取列表其余部分的大小为n + 1的所有组合,并且不添加第一个元素。
然后你就完成了。
为了优化起见,您可以获得幻想,只是假装复制/删除元素。
答案 1 :(得分:1)
您可以将t从2迭代到Y,并创建一个大小为X的数组A,前面是X-t 0,后面是t 1,然后使用下面的代码:
do{
//1s in array A now correspond to a valid combination
}while(std::next_permutation(A,A+X));
当重复所有与大小为t的组合时,循环将停止
next_permutation在标头算法中,它会将数组重新排序到下一个按字典顺序排列更大的排列,如果数组已经在按字典顺序排列最大的排列,则返回false。它的复杂性是O(n),因为你还需要迭代一次数组,所以它不会成为一个问题。整个过程的总复杂度将受到O(2 ^ n * n)的限制。
所以这是一个伪代码示例
D[X] = {1,2,3,4} Y = 3 //the input
For t = 2,3,..,Y
A[X] = {0,...,0,1,...,1} // X - t 0s and t 1s
Do
For j = 0,1,...,X-1
if A[j] == 1
output D[j]
end if
end for
output newline
While next_permutation(A,A+X)
end for
输出看起来像
3 4
2 4
2 3
1 4
1 3
1 2
2 3 4
1 3 4
1 2 4
1 2 3