Generate All Subsets Powerset in DSA Typescript - Time & Space Complexity
We want to understand how the time needed grows when we find all subsets of a set.
How does the work increase as the input set gets bigger?
Analyze the time complexity of the following code snippet.
function generateSubsets(nums: number[]): number[][] {
const result: number[][] = [];
function backtrack(start: number, subset: number[]) {
result.push([...subset]);
for (let i = start; i < nums.length; i++) {
subset.push(nums[i]);
backtrack(i + 1, subset);
subset.pop();
}
}
backtrack(0, []);
return result;
}
This code finds all subsets (the powerset) of the input array by exploring choices recursively.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive calls that explore each subset possibility.
- How many times: Each element can be either included or excluded, so about 2n subsets are generated.
As the input size grows, the number of subsets doubles for each new element.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 1,024 subsets |
| 20 | About 1,048,576 subsets |
| 30 | About 1,073,741,824 subsets |
Pattern observation: The work doubles with each added element, growing very fast.
Time Complexity: O(n * 2n)
This means the time grows very fast because we must build all subsets, and each subset can take up to n steps to copy.
[X] Wrong: "Generating all subsets is just O(n) because we just loop through the array once."
[OK] Correct: We actually explore every combination of elements, which grows exponentially, not linearly.
Understanding this exponential growth helps you explain why some problems take longer and shows you can reason about complex recursive solutions.
"What if we only wanted subsets of a fixed size k? How would the time complexity change?"