大小为k的子集的时间分析

时间:2018-12-01 04:50:13

标签: combinations

public static List < List < Integer >> combinations(int n, int k) {
    List < List < Integer >> result = new ArrayListof);
    directedCombinations(n, k, 1, new ArrayList < Integer > (), result);
    return result;
}
private static void directedCombinations(int n, int k, int offset,
    291 List < Integer > partialCombination,
    ListcList < Integer >> result) {
    if (partialCombination.size() == k) {
        result.add(new ArrayList < > (partialCombination));
        return;
    }
    // Generate remaining combinations over {offset , ...» n - 1} of size
    // numRemaining.
    final int numRemaining = k - partialCombination.size();
    for (int i = offset; i <= n && numRemaining <= n - i + 1; ++i) {
        partialCombination.add(i);
        directedCombinations(n, k, i + 1, partialCombination, result);
        partialCombination.remove(partialCombination.size() - 1);
    }
}

此解决方案的时间分析是什么,我的书说它是O(n * nCk)? nCk是有意义的,但是不知道为什么它是n * nCk。感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

因为这一行:

result.add(new ArrayList < > (partialCombination));

您已经生成了C(n,k)个解决方案。现在,您将对每个阵列执行数组创建。这花费的时间与其大小成正比,即O(k)。因此,更确切地说时间是O(k * C(n,k))

因此,如果您不必输出数组,而是返回1或数组中数字的总和,则可以使算法在O(C(n,k))中运行。 / p>