web-dev-qa-db-ja.com

すべての可能な組み合わせを生成-Java

アイテムのリスト{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);
    }
}

配列サイズが大きい場合、これを行うより効率的な方法はありますか?

12
Maddy

組み合わせをバイナリシーケンスと見なし、4つすべてが存在する場合は1111を取得し、最初のアルファベットがない場合は0111を取得します。したがって、n個のアルファベットの場合は2 ^ n -1になります(0から含まれていません)組み合わせ。

これで、生成されたバイナリシーケンスで、コードが1の場合、要素は存在し、そうでない場合は含まれません。以下は同じものの実装です:-

 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();
    }
13
yash sachdeva