生成所有可能的组合 - Java

时间:2016-06-15 12:19:10

标签: java combinations

我有一个项目列表{a,b,c,d},我需要生成所有可能的组合,

  • 您可以选择任意数量的项目
  • 顺序不重要(ab = ba)
  • 不考虑空集

如果我们采取可能性,那应该是,

n=4, number of items
total #of combinations = 4C4 + 4C3 + 4C2 + 4C1 = 15

我使用了以下递归方法:

private void countAllCombinations (String input,int idx, String[] options) {
    for(int i = idx ; i < options.length; i++) {
        String output = input + "_" + options[i];
        System.out.println(output);
        countAllCombinations(output,++idx, options);
    }
}

public static void main(String[] args) {
    String arr[] = {"A","B","C","D"};
    for (int i=0;i<arr.length;i++) {
        countAllCombinations(arr[i], i, arr);
    }
}

当数组大小很大时,是否有更有效的方法?

1 个答案:

答案 0 :(得分:12)

将组合视为二进制序列,如果所有4都存在,我们得到1111,如果第一个字母表缺失那么我们得到0111,依此类推。所以对于n个字母,我们将得到2 ^ n -1 (因为不包括0)组合。

现在,在生成的二进制序列中,如果代码为1,则元素存在,否则不包括在内.Below是相同的实现: -

 String arr[] = { "A", "B", "C", "D" };
    int n = arr.length;
    int N = (int) Math.pow(2d, Double.valueOf(n));  
    for (int i = 1; i < N; i++) {
        String code = Integer.toBinaryString(N | i).substring(1);
        for (int j = 0; j < n; j++) {
            if (code.charAt(j) == '1') {
                System.out.print(arr[j]);
            }
        }
        System.out.println();
    }