我有两种算法来计算集合的幂集(所有子集)。
例如,{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);
}
答案 0 :(得分:1)
它们是相同的,两者的复杂度都是O(2 ^ n),因为你的第一个算法的复杂度是O(1 + 2 + 2 ^ 2 + ... + 2 ^(n-1))= O (2 ^ n),你不能只查看内部循环的所有复杂性,你必须分别计算每个,然后像我一样添加它们,希望这篇文章对你有帮助!