如何获取列表中的所有元素组合?

时间:2017-11-07 03:39:01

标签: c++ algorithm combinations combinatorics

获取X元素列表时,如何获得所有双打,三元组,...(Y)这些元素的组合?
Y是所需组合的大小。例如:如果Y = 2,我需要得到所有可能的对 我不能两次给出相同的组合(例如:[a,b]和[b,a]是相同的组合)

2 个答案:

答案 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