计算能力集算法分析

时间:2017-07-15 22:45:28

标签: algorithm

我有两种算法来计算集合的幂集(所有子集)。 例如,{1, 2, 3} =>权力集是{}, {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}

一种算法使用迭代解决方案; i(外部for循环)为nums数组运行,j运行到目前为止计算的所有子集,并继续向先前计算的子集添加ith个数。

static List<List<Integer>> subsetItr(int[] nums) {
    List<List<Integer>> subsets = new LinkedList<>();
    subsets.add(new LinkedList<>());
    for (int i = 0; i < nums.length; i++) {
        int size = subsets.size();
        for (int j = 0; j < size; j++) {
            List<Integer> current = new LinkedList<>(subsets.get(j));
            current.add(nums[i]);
            subsets.add(current);
        }
    }
    return subsets;
}

因此,我想确保我正确分析运行时间。假设n是nums数组的大小,那么外部for循环是O(n)。 Inner for循环每次迭代时指数增加一倍,因此内循环为O(2^n)。最终的复杂性是O(n*2^n)。这比下面的递归解决方案O(2^n)慢吗?

static List<List<Integer>> subsets(int[] nums) {
    List<Integer> current = new LinkedList<>();
    _subsets(nums, 0, current, ret);
    return ret;
}

static void _subsets(int[] nums, int pos, List<Integer> current) {
    if (pos == nums.length) {
        System.out.println(current);
        return;
    }
    current.add(nums[pos]);
    _subsets(nums, pos + 1, current, ret);
    current.remove(current.size() - 1);
    _subsets(nums, pos + 1, current, ret);
}

1 个答案:

答案 0 :(得分:1)

它们是相同的,两者的复杂度都是O(2 ^ n),因为你的第一个算法的复杂度是O(1 + 2 + 2 ^ 2 + ... + 2 ^(n-1))= O (2 ^ n),你不能只查看内部循环的所有复杂性,你必须分别计算每个,然后像我一样添加它们,希望这篇文章对你有帮助!