Bird
Raised Fist0
DSA Cprogramming~5 mins

Generate All Subsets Powerset in DSA C - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Generate All Subsets Powerset
O(n * 2^n)
Understanding Time Complexity

When we generate all subsets of a set, we want to know how the work grows as the set gets bigger.

We ask: How many steps does it take to list every possible subset?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


void generateSubsets(int arr[], int n) {
    int total = 1 << n; // 2^n subsets
    for (int i = 0; i < total; i++) {
        for (int j = 0; j < n; j++) {
            if (i & (1 << j)) {
                // include arr[j] in current subset
            }
        }
    }
}
    

This code creates every subset by checking each combination of elements using bits.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Nested loops where outer runs 2^n times and inner runs n times.
  • How many times: Outer loop runs once for each subset (2^n), inner loop runs n times per subset.
How Execution Grows With Input

As the input size n grows, the number of subsets doubles each time, and for each subset, we check n elements.

Input Size (n)Approx. Operations
10~10 * 2^10 = 10,240
20~20 * 2^20 = 20,971,520
30~30 * 2^30 = 32,212,254,720

Pattern observation: The work grows very fast, doubling with each added element and multiplying by n.

Final Time Complexity

Time Complexity: O(n * 2^n)

This means the time needed grows very fast as the input size grows, because we list all subsets and check each element.

Common Mistake

[X] Wrong: "Generating all subsets is just O(2^n) because there are 2^n subsets."

[OK] Correct: We also spend time checking each element in every subset, so the work multiplies by n, making it O(n * 2^n).

Interview Connect

Understanding this complexity helps you explain why generating all subsets is costly and shows you can analyze nested loops with exponential growth.

Self-Check

"What if we only wanted subsets of a fixed size k? How would the time complexity change?"

Practice

(1/5)
1. What does the term powerset mean in the context of subsets?
easy
A. The largest subset of a given set
B. All possible subsets of a given set including empty and full set
C. Only the subsets with odd number of elements
D. Only the subsets with even number of elements

Solution

  1. Step 1: Understand the definition of powerset

    The powerset of a set is the collection of all possible subsets, including the empty set and the set itself.
  2. Step 2: Compare options with definition

    All possible subsets of a given set including empty and full set correctly describes all subsets including empty and full set. Other options limit subsets incorrectly.
  3. Final Answer:

    All possible subsets of a given set including empty and full set -> Option B
  4. Quick Check:

    powerset = all subsets [OK]
Hint: Powerset means every subset possible, including empty [OK]
Common Mistakes:
  • Thinking powerset excludes empty set
  • Confusing powerset with only even-sized subsets
  • Assuming powerset means largest subset only
2. Which of the following C code snippets correctly initializes an empty subset list for generating a powerset?
easy
A. int subsets[1][1] = {{0}};
B. int subsets[0][0] = {{}};
C. int subsets[1][0] = {{}};
D. int subsets[1][0];

Solution

  1. Step 1: Understand empty subset initialization in C

    An empty subset list for powerset starts with one subset: the empty set, which has zero elements.
  2. Step 2: Check array dimensions and initialization

    int subsets[1][0] = {{}}; correctly declares an array with 1 subset of size 0, initialized empty. Other options have invalid sizes or syntax.
  3. Final Answer:

    int subsets[1][0] = {{}}; -> Option C
  4. Quick Check:

    Empty subset list = subsets[1][0] [OK]
Hint: Empty subset list has one subset with zero elements [OK]
Common Mistakes:
  • Using zero subsets instead of one
  • Incorrect array size for empty subset
  • Invalid initialization syntax in C
3. What is the output of the following C code that generates all subsets of arr = {1, 2}?
#include 
void printSubsets(int arr[], int n) {
    int total = 1 << n;
    for (int i = 0; i < total; i++) {
        printf("{");
        for (int j = 0; j < n; j++) {
            if (i & (1 << j)) {
                printf("%d ", arr[j]);
            }
        }
        printf("} ");
    }
}
int main() {
    int arr[] = {1, 2};
    printSubsets(arr, 2);
    return 0;
}
medium
A. {} {1} {2} {1 2}
B. {} {2} {1} {2 1}
C. {} {1} {2} {12}
D. {} {1} {2} {2 1}

Solution

  1. Step 1: Understand bitmask iteration for subsets

    For n=2, total subsets = 4 (0 to 3). Each bit in i represents inclusion of arr[j].
  2. Step 2: Trace output for each i

    i=0: no bits set -> {}
    i=1: bit0 set -> {1 }
    i=2: bit1 set -> {2 }
    i=3: bits0 and 1 set -> {1 2 }
  3. Final Answer:

    {} {1} {2} {1 2} -> Option A
  4. Quick Check:

    Bitmask subsets = {} {1} {2} {1 2} [OK]
Hint: Use bitmask from 0 to 2^n-1 to list subsets [OK]
Common Mistakes:
  • Mixing order of elements in subsets
  • Printing subsets without spaces
  • Confusing bit positions with element order
4. Identify the error in the following C code snippet that attempts to generate all subsets of arr = {1, 2, 3}:
void generateSubsets(int arr[], int n) {
    int total = 1 << n;
    for (int i = 0; i <= total; i++) {
        printf("{");
        for (int j = 0; j < n; j++) {
            if (i & (1 << j)) {
                printf("%d ", arr[j]);
            }
        }
        printf("}\n");
    }
}
medium
A. Missing initialization of variable i
B. Bitwise AND operator is used incorrectly
C. Inner loop should run from 1 to n instead of 0 to n-1
D. Loop runs one extra time causing out-of-range subsets

Solution

  1. Step 1: Analyze loop range for total subsets

    Total subsets for n elements is 2^n, so loop should run from 0 to total-1.
  2. Step 2: Identify off-by-one error

    Loop runs from i=0 to i=total (inclusive), which is one extra iteration causing invalid subset index.
  3. Final Answer:

    Loop runs one extra time causing out-of-range subsets -> Option D
  4. Quick Check:

    Loop limit = total-1, not total [OK]
Hint: Loop subsets from 0 to 2^n - 1 only [OK]
Common Mistakes:
  • Using <= total instead of < total in loop
  • Incorrect bitwise operations
  • Wrong inner loop range
5. Given an array arr = {1, 2, 2}, which of the following C code modifications correctly generates all unique subsets (powerset without duplicates)?
hard
A. Sort array first, then skip duplicates while generating subsets
B. Use a hash set to store subsets and avoid duplicates
C. Generate all subsets normally without any change
D. Only generate subsets of size 1 and 2

Solution

  1. Step 1: Understand duplicate subsets problem

    Array with duplicates can produce repeated subsets if not handled.
  2. Step 2: Use sorting and skip duplicates approach

    Sorting arr groups duplicates together. While generating subsets, skip adding duplicate elements at the same recursion level to avoid repeated subsets.
  3. Final Answer:

    Sort array first, then skip duplicates while generating subsets -> Option A
  4. Quick Check:

    Sort + skip duplicates = unique subsets [OK]
Hint: Sort array and skip duplicates during subset generation [OK]
Common Mistakes:
  • Ignoring duplicates causing repeated subsets
  • Using hash sets without proper subset hashing
  • Limiting subset sizes incorrectly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard