【问题标题】:Java: Generate nCr array from input String array and returning itJava:从输入字符串数组生成 nCr 数组并返回它
【发布时间】:2019-10-29 02:23:58
【问题描述】:

我想从输入数组中返回所有可能组合的完整数组。我想生成 n 选择 k 组合,其中 k = 1 到 n。到目前为止,我非常不成功。

static void combinationUtil(String[] arr, String data[], int start, int end, int index, int r, float[][] info) {
        // Current combination is ready to be printed, print it
        strat newStrat = new strat(0, 0, 0, null);
        if (index == r) {
            //THIS IS WHERE THE COMBINATION I WANT APPEARS
            return;
        }

        for (int i = start; i <= end && end - i + 1 >= r - index; i++) {
            data[index] = arr[i];
            combinationUtil(arr, data, i + 1, end, index + 1, r, info);
        }
        return;
    }

public static void getCombinations(String[] arr, int n, int r, float[][] info) {
        String[] data = new String[r];
        combinationUtil(arr, data, 0, n - 1, 0, r, info);
    }

public static void main(String[] args) throws IOException, InterruptedException {
        //Array I want to get all k 1:n combinations of
        String[] array = { "TST1", "TST2", "TST3"} 
        //start a timer because that's always fun
        long startTime = System.nanoTime();
        //cycle through all 'pick k values'
        for (int i = 1; i < 8; i++) {
            getCombinations(array, n, i, info);
        }
        //Math's up. How Long did that take?
        long endTime = System.nanoTime();
        //IDEALLY PRINT THE COMBINATIONAL ARRAY HERE
        System.out.println(Arrays.deepToString(_____));
        //Don't forget to print the time ;)
        System.out.println("Duration: "+(endTime - startTime)+" ns");
    }

我已经尝试了所有我能想到的和谷歌。从将“数据”数组传递给函数,将其与之前的自身连接,将旧数组复制到最新索引是最新“数据”的新数组,ArrayLists,Stacks,.push(),.add() ,获取可能组合的总数并将它们插入到全局数组索引中......没什么......我被烧毁了......当然理想的结果应该是这样的:

[["TST1"], ["TST2"], ["TST3"], ["TST1", "TST2"], ["TST1", "TST3"], ["TST2", "TST3"], ["TST1", "TST2", "TST3"]

在这一点上,甚至可以添加一点

"It is done. Go. Be happy!"

上面的代码运行良好,但是组合只出现在combinationUtil()中,而不是我想在main()中使用累积结果的地方。那么,我到底做错了什么?

【问题讨论】:

  • 使data成为类的静态成员变量(包含方法main),如:private static String[] data。这样你就可以从类中的任何地方访问它,包括内部方法main

标签: java arrays string algorithm math


【解决方案1】:

您想计算大小为 n 的数组中 r 元素的可能组合。你可以试试这段代码。我将该函数称为 nCr(不确定这是否是我们试图解决的问题的正确数学符号)

public static void main(String[] args) {
    String[] array2 = { "TST1", "TST2", "TST3"};
    List<List<String>> l = new ArrayList<>();
    for (var i: Arrays.asList(0, 1, 2, 3)) {
        l.addAll(nCr(array2, i));
    }
    System.out.println(l);
}

private static List<List<String>> nCr(String[] array, int r) {
    List<List<String>> result = new ArrayList<>();
    if (r == 0) return result;
    if (r == 1) return nC1(array);

    for (int i = 0; i < array.length - r + 1; i++) {
        List<List<String>> result2 = nCr(
                Arrays.copyOfRange(array, i + 1, array.length),
                r - 1);
        for (var x: result2 ) {
            x.add(array[i]);
            result.add(x);
        }
    }
    return result;
}

private static List<List<String>> nC1(String[] array) {
    List<List<String>> l = new ArrayList<>();
    for (var x: array) {
        l.add(new ArrayList<>(Arrays.asList(x)));
    }
    return l;
}

输出:

[[TST1], [TST2], [TST3], [TST2, TST1], [TST3, TST1], [TST3, TST2], [TST3, TST2, TST1]]

【讨论】:

  • 非常好。甚至比我使用的还要快!
  • 这是一个递归函数。我们已经知道 0 和 1 选择的基本情况。对于 2 个选择,我们从剩余项目中选择 1 个项目和 1 个选择列表。然后我们从剩余的项目中将选择的一项乘以选择列表。试着想想你将如何从列表中选择 2 个项目。我将添加参考。一本数学书很好地解释了这一点,我可以提供帮助。这就是他们所说的组合学。
猜你喜欢
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 2013-01-18
相关资源
最近更新 更多