配列からサイズnのすべての組み合わせを取得するアルゴリズム(Java)?

Esostack:

現在、私は配列と整数nを取り、各サイズnの組み合わせのリスト(つまり、int配列のリスト)を提供する関数を記述しようとしています。n個のネストされたループを使用してそれを書くことができますが、これはサブセットの特定のサイズでのみ機能します。どのようなサイズの組み合わせでも機能するように一般化する方法がわかりません。再帰を使用する必要があると思いますか?

これは3つの要素のすべての組み合わせのコードであり、任意の数の要素のアルゴリズムが必要です。

import java.util.List;
import java.util.ArrayList;

public class combinatorics{
    public static void main(String[] args) {

        List<int[]> list = new ArrayList<int[]>();
        int[] arr = {1,2,3,4,5};
        combinations3(arr,list);
        listToString(list);
    }

    static void combinations3(int[] arr, List<int[]> list){
        for(int i = 0; i<arr.length-2; i++)
            for(int j = i+1; j<arr.length-1; j++)
                for(int k = j+1; k<arr.length; k++)
                    list.add(new int[]{arr[i],arr[j],arr[k]});
    }

    private static void listToString(List<int[]> list){
        for(int i = 0; i<list.size(); i++){ //iterate through list
            for(int j : list.get(i)){ //iterate through array
                System.out.printf("%d ",j);
            }
        System.out.print("\n");
        }
    }
}
Alex Salauyou:

これは、すべてのkサブセットまたはk組み合わせを生成するというよく研究された問題であり、再帰なしで簡単に実行できます。

アイデアは、入力配列(からまでの番号)からの要素kインデックスシーケンスを昇順で維持するサイズの配列を持つことです。サブセットは、最初の配列からこれらのインデックスでアイテムを取得することによって作成できます。)したがって、そのようなインデックスシーケンスをすべて生成する必要があります。0n - 1

最初のインデックスシーケンスはになり[0, 1, 2, ... , k - 1]、2番目のステップでに切り替わり[0, 1, 2,..., k]、次にに切り替わります[0, 1, 2, ... k + 1]最後の可能なシーケンスはになります[n - k, n - k + 1, ..., n - 1]

各ステップで、アルゴリズムは、インクリメントできる最終アイテムに最も近いものを探し、それをインクリメントして、そのアイテムまでのアイテムを埋めます。

説明するために、とを検討n = 7k = 3ます。最初のインデックスシーケンスは[0, 1, 2]、それ以降同様[0, 1, 3]です...ある時点で、次のようになります[0, 5, 6]

[0, 5, 6] <-- scan from the end: "6" cannot be incremented, "5" also, but "0" can be
[1, ?, ?] <-- "0" -> "1"
[1, 2, 3] <-- fill up remaining elements

next iteration:

[1, 2, 3] <-- "3" can be incremented
[1, 2, 4] <-- "3" -> "4"

したがって、[0, 5, 6]が続き[1, 2, 3]、その後が続きます[1, 2, 4]

コード:

int[] input = {10, 20, 30, 40, 50};    // input array
int k = 3;                             // sequence length   

List<int[]> subsets = new ArrayList<>();

int[] s = new int[k];                  // here we'll keep indices 
                                       // pointing to elements in input array

if (k <= input.length) {
    // first index sequence: 0, 1, 2, ...
    for (int i = 0; (s[i] = i) < k - 1; i++);  
    subsets.add(getSubset(input, s));
    for(;;) {
        int i;
        // find position of item that can be incremented
        for (i = k - 1; i >= 0 && s[i] == input.length - k + i; i--); 
        if (i < 0) {
            break;
        }
        s[i]++;                    // increment this item
        for (++i; i < k; i++) {    // fill up remaining items
            s[i] = s[i - 1] + 1; 
        }
        subsets.add(getSubset(input, s));
    }
}

// generate actual subset by index sequence
int[] getSubset(int[] input, int[] subset) {
    int[] result = new int[subset.length]; 
    for (int i = 0; i < subset.length; i++) 
        result[i] = input[subset[i]];
    return result;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

単一のセットから特定のサイズのすべての組み合わせを生成するPHPアルゴリズム

分類Dev

nからk個の要素のすべての組み合わせを返すアルゴリズム

分類Dev

リストのリストからすべての組み合わせを取得します(組み合わせアルゴリズム)

分類Dev

クイズで可能なすべての回答の組み合わせを作成するアルゴリズム

分類Dev

k文字のサイズnの組み合わせを生成するためのアルゴリズム

分類Dev

すべての組み合わせとそれらの組み合わせのすべてのグループを作成できるアルゴリズム

分類Dev

文字列のすべての組み合わせを生成するアルゴリズム

分類Dev

すべての文字列の組み合わせを生成するアルゴリズム

分類Dev

kサイズの文字リストですべてのnサイズの組み合わせを取得する

分類Dev

2つの配列をすべての可能な組み合わせの配列にマージするアルゴリズム

分類Dev

オブジェクト内のすべてのアイテムの組み合わせを取得するための効率的なアルゴリズム

分類Dev

この組み合わせ合計アルゴリズムをjavaからjavascriptに変換する方法

分類Dev

ベクトルのリストからすべての可能な組み合わせを作成するアルゴリズム関数

分類Dev

すべての組み合わせを見つけるためのこのアルゴリズムの時間計算量はどれくらいですか?

分類Dev

PythonからC ++へ:再帰を使用してKnapsackのすべての組み合わせを一覧表示するアルゴリズム

分類Dev

Java:整数のセットのすべての可能な組み合わせを行列のリストに配置するアルゴリズム

分類Dev

一般的なサイズの配列のすべての組み合わせを取得するにはどうすればよいですか?

分類Dev

指定された文字列の文字のすべての組み合わせを辞書式順序で印刷するアルゴリズム

分類Dev

入力のすべての組み合わせ/順列を生成するための効率的なPHPアルゴリズム

分類Dev

kセットに分割されたn個の要素のすべての組み合わせを生成するアルゴリズム

分類Dev

グループの配列から可能なすべての組み合わせを順番に再帰的に取得します。配列サイズとグループサイズは1-Xで、Xは多数ではありません

分類Dev

配列からのサイズNの組み合わせ

分類Dev

要素の休閑の組み合わせを取得するための優れたアルゴリズム

分類Dev

nからk個の要素の「アンチグレー」オンデマンドの組み合わせを生成するためのアルゴリズム

分類Dev

nからk個の要素のすべての組み合わせを返すアルゴリズムを実装する次のC#linqコードを理解する方法

分類Dev

特定の数をチェックするためのアルゴリズムは、特定の配列内の組み合わせの合計です。

分類Dev

5 * 12グリッド内のすべての一意の組み合わせのアルゴリズム

分類Dev

Matlabで組み合わせを取得するための高速アルゴリズム?

分類Dev

合計がN以下のサイズLのすべての可能な配列を見つけるアルゴリズム

Related 関連記事

  1. 1

    単一のセットから特定のサイズのすべての組み合わせを生成するPHPアルゴリズム

  2. 2

    nからk個の要素のすべての組み合わせを返すアルゴリズム

  3. 3

    リストのリストからすべての組み合わせを取得します(組み合わせアルゴリズム)

  4. 4

    クイズで可能なすべての回答の組み合わせを作成するアルゴリズム

  5. 5

    k文字のサイズnの組み合わせを生成するためのアルゴリズム

  6. 6

    すべての組み合わせとそれらの組み合わせのすべてのグループを作成できるアルゴリズム

  7. 7

    文字列のすべての組み合わせを生成するアルゴリズム

  8. 8

    すべての文字列の組み合わせを生成するアルゴリズム

  9. 9

    kサイズの文字リストですべてのnサイズの組み合わせを取得する

  10. 10

    2つの配列をすべての可能な組み合わせの配列にマージするアルゴリズム

  11. 11

    オブジェクト内のすべてのアイテムの組み合わせを取得するための効率的なアルゴリズム

  12. 12

    この組み合わせ合計アルゴリズムをjavaからjavascriptに変換する方法

  13. 13

    ベクトルのリストからすべての可能な組み合わせを作成するアルゴリズム関数

  14. 14

    すべての組み合わせを見つけるためのこのアルゴリズムの時間計算量はどれくらいですか?

  15. 15

    PythonからC ++へ:再帰を使用してKnapsackのすべての組み合わせを一覧表示するアルゴリズム

  16. 16

    Java:整数のセットのすべての可能な組み合わせを行列のリストに配置するアルゴリズム

  17. 17

    一般的なサイズの配列のすべての組み合わせを取得するにはどうすればよいですか?

  18. 18

    指定された文字列の文字のすべての組み合わせを辞書式順序で印刷するアルゴリズム

  19. 19

    入力のすべての組み合わせ/順列を生成するための効率的なPHPアルゴリズム

  20. 20

    kセットに分割されたn個の要素のすべての組み合わせを生成するアルゴリズム

  21. 21

    グループの配列から可能なすべての組み合わせを順番に再帰的に取得します。配列サイズとグループサイズは1-Xで、Xは多数ではありません

  22. 22

    配列からのサイズNの組み合わせ

  23. 23

    要素の休閑の組み合わせを取得するための優れたアルゴリズム

  24. 24

    nからk個の要素の「アンチグレー」オンデマンドの組み合わせを生成するためのアルゴリズム

  25. 25

    nからk個の要素のすべての組み合わせを返すアルゴリズムを実装する次のC#linqコードを理解する方法

  26. 26

    特定の数をチェックするためのアルゴリズムは、特定の配列内の組み合わせの合計です。

  27. 27

    5 * 12グリッド内のすべての一意の組み合わせのアルゴリズム

  28. 28

    Matlabで組み合わせを取得するための高速アルゴリズム?

  29. 29

    合計がN以下のサイズLのすべての可能な配列を見つけるアルゴリズム

ホットタグ

アーカイブ