【问题标题】:Ordered Sampling with Replacement带替换的有序抽样
【发布时间】:2016-11-19 15:58:35
【问题描述】:

我真的陷入了这个困境。

我想生成所有组合,以便有带替换的有序采样(我认为这就是它的名称,请参见我的示例),结果以数组数组(二维数组)的形式输出。

例如

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]]

我真的不确定如何有效地做到这一点。任何指针表示赞赏!

【问题讨论】:

  • 我们可以看看你的代码吗?
  • "Ordered sampling with replacement" 看起来等同于 cartesian power {0..n-1}^k
  • @suspicousdog 是的,原来这只是笛卡尔积。我只是不知道它是这样称呼的。谢谢

标签: java combinatorics


【解决方案1】:

这里我们有一个包含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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    相关资源
    最近更新 更多