2016-11-19 4 views
2

本当にこの1つの轍にはまった。交換して注文したサンプリング

置き換えられた順序付きサンプリングがあるように(私はこれが呼び出されたものだと思います。私の例を参照)、結果は配列の配列(2D配列)に出力されます。例えば

public static int[][] combinations(int n, int k) 
入力に

N = 3、K = 2は与えるだろう:

[0,0]、[0,1]、[0,2]、[1 、0]、[1,1]、[1,2]、[2,0]、[2,1]、[2,2]]

これを効率的に行う方法は本当にわかりません。すべてのポインタが評価されています!

+0

私たちはあなたのコードを見てもらえますか? – user6904265

+0

「置き換えられた順序付きサンプリング」は[Cartesian Power](https://en.wikipedia.org/wiki/Cartesian_product#Cartesian_power) '{0..n-1}^k'に相当します。 –

+0

@suspicousdogええそれは単なるデカルト積であった。私はちょうどそれがそのように呼ばれていたのか分からなかった。ありがとう – ProgrammedChem

答えて

0

ここではnの要素が設定されており、順序性の問題と繰り返しが許されるように、k個のサンプルをそのセットから描画したいと考えています。ここで

コード:

public static void main(String[] args) { 
    int n = 4; 
    int k = 2; 
    int[][] result = combinations(n, k); 
    System.out.println(Arrays.deepToString(result)); 
    //this will print: 
    //[[0,0],[0,1],[0,2],[0,3],[1,0],[1,1],[1,2],[1,3],[2,0],[2,1],[2,2],[2,3],[3,0],[3,1],[3,2],[3,3]] 
} 

public static int[][] combinations(int n, int k) { 
    int[] nArray = IntStream.range(0, n).toArray(); 
    List<String> list = new ArrayList<String>(); 
    combinationStrings(k, nArray, "", list); 
    return fromArrayListToArray(list, k); 
} 

private static void combinationStrings(int k, int[] nArray, String currentString, List<String> list) { 
    if (currentString.length() == k) { 
     list.add(currentString); 
    } else { 
     for (int i = 0; i < nArray.length; i++) { 
      String oldCurrent = currentString; 
      currentString += nArray[i]; 
      combinationStrings(k, nArray, currentString, list); 
      currentString = oldCurrent; 
     } 
    } 
} 

private static int[][] fromArrayListToArray(List<String> list, int k) { 
    int[][] result = new int[list.size()][k]; 
    for (int i=0;i<list.size();i++) { 
     String[] split = list.get(i).split("\\B"); 
     for (int j = 0; j < split.length; j++) { 
      result[i][j] = Integer.parseInt(split[j]); 
     } 
    } 
    return result; 
} 
関連する問題