2016-11-19 5 views
2

Im действительно застрял в колеи для этого.Упорядоченный выборка с заменой

Я хочу сгенерировать все комбинации таким образом, что есть упорядоченная выборка с заменой (я думаю, что это то, что называется, см. Мой пример), и результат выводится в массиве массивов (2D-массив).

Например

public static int[][] combinations(int n, int k) 

на входе п = 3, к = 2 даст:

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

Я действительно не уверен, как это сделать эффективно. Любые указатели оцениваются!

+0

Можем ли мы увидеть код? – user6904265

+0

«Упорядоченная выборка с заменой» выглядит эквивалентно [декартовой мощности] (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; 
}