Bird
Raised Fist0
DSA Goprogramming~5 mins

Subsets Generation Using Bitmask in DSA Go - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Subsets Generation Using Bitmask
O(n * 2^n)
Understanding Time Complexity

We want to understand how the time needed to generate all subsets grows as the input size increases.

How does the number of operations change when we create subsets using bitmasks?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


func subsets(nums []int) [][]int {
    n := len(nums)
    result := [][]int{}
    for mask := 0; mask < (1 << n); mask++ {
        subset := []int{}
        for i := 0; i < n; i++ {
            if mask&(1<

This code generates all subsets of the input list by using bitmasks to decide which elements to include.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Two nested loops - outer loop runs over all bitmasks, inner loop checks each bit.
  • How many times: Outer loop runs 2^n times, inner loop runs n times for each outer iteration.
How Execution Grows With Input

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

Input Size (n)Approx. Operations
10About 10 * 2^10 = 10,240
100About 100 * 2^100 (very large)
1000About 1000 * 2^1000 (extremely large)

Pattern observation: The operations grow exponentially with n, doubling for each additional element.

Final Time Complexity

Time Complexity: O(n * 2^n)

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

Common Mistake

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

[OK] Correct: We also spend time checking each element for every subset, so the inner loop adds a factor of n, making it O(n * 2^n).

Interview Connect

Understanding this complexity helps you explain why generating all subsets is expensive and shows your grasp of exponential growth in algorithms.

Self-Check

"What if we used recursion instead of bitmasks to generate subsets? How would the time complexity change?"

Practice

(1/5)
1. What does the bitmask technique help generate when applied to a set of elements?
easy
A. Only subsets with odd number of elements
B. Only the largest subset
C. All possible subsets of the set
D. Only subsets with even number of elements

Solution

  1. Step 1: Understand bitmask representation

    Each bit in the bitmask represents whether an element is included (1) or excluded (0) in a subset.
  2. Step 2: Generate subsets using all bitmasks

    By iterating from 0 to 2^n - 1, all combinations of included/excluded elements are covered, producing all subsets.
  3. Final Answer:

    All possible subsets of the set -> Option C
  4. Quick Check:

    Bitmask = subsets generator [OK]
Hint: Bitmask bits map directly to subset inclusion [OK]
Common Mistakes:
  • Thinking bitmask generates only specific subsets
  • Confusing bitmask with sorting or filtering
  • Ignoring subsets with zero elements
2. Which of the following is the correct Go syntax to iterate over all bitmasks for a set of size n?
easy
A. for mask := 0; mask < n; mask++ { }"
B. for mask := 1; mask <= n; mask++ { }"
C. for mask := 0; mask <= n; mask++ { }"
D. for mask := 0; mask < (1 << n); mask++ { }"

Solution

  1. Step 1: Understand bitmask range

    For n elements, bitmasks range from 0 to 2^n - 1, which is (1 << n) - 1.
  2. Step 2: Correct loop condition

    The loop must run from 0 up to but not including (1 << n), so mask < (1 << n) is correct.
  3. Final Answer:

    for mask := 0; mask < (1 << n); mask++ { } -> Option D
  4. Quick Check:

    Loop runs 0 to 2^n-1 [OK]
Hint: Use mask < (1 << n) for full bitmask range [OK]
Common Mistakes:
  • Using mask <= n instead of mask < (1 << n)
  • Starting mask from 1 misses empty subset
  • Using mask < n only iterates n times, not 2^n
3. What is the output subsets generated by the following Go code snippet?
arr := []int{1, 2}
for mask := 0; mask < (1 << 2); mask++ {
  subset := []int{}
  for i := 0; i < 2; i++ {
    if mask&(1<
medium
A. [ ] [1] [2] [1 2]
B. [ ] [2] [1] [1 2]
C. [1] [2] [1 2] [ ]
D. [1 2] [1] [2] [ ]

Solution

  1. Step 1: Understand bitmask values

    For n=2, masks go 0 to 3: 0 (00), 1 (01), 2 (10), 3 (11).
  2. Step 2: Map bits to subsets

    Mask 0: no bits set -> [] Mask 1: bit 0 set -> [1] Mask 2: bit 1 set -> [2] Mask 3: bits 0 and 1 set -> [1, 2]
  3. Final Answer:

    [ ] [1] [2] [1 2] -> Option A
  4. Quick Check:

    Bitmask order matches subsets [OK]
Hint: Map bits to elements in order from least significant bit [OK]
Common Mistakes:
  • Mixing order of subsets printed
  • Confusing which bit corresponds to which element
  • Missing empty subset when mask=0
4. Identify the error in this Go code snippet for generating subsets using bitmask:
arr := []int{1, 2, 3}
for mask := 0; mask <= (1 << len(arr)); mask++ {
  subset := []int{}
  for i := 0; i < len(arr); i++ {
    if mask&(1<
medium
A. Loop condition should be mask < (1 << len(arr))
B. Bitwise AND operator should be | instead of &
C. Inner loop should run from i = 1 to len(arr)
D. Array indexing should start from 1 instead of 0

Solution

  1. Step 1: Analyze loop condition

    The outer loop runs mask from 0 to (1 << n) inclusive, which is one too many iterations (2^n + 1).
  2. Step 2: Correct loop range

    It should run from 0 up to but not including (1 << n), so mask < (1 << n) is correct to avoid out-of-range subsets.
  3. Final Answer:

    Loop condition should be mask < (1 << len(arr)) -> Option A
  4. Quick Check:

    Loop must run 2^n times exactly [OK]
Hint: Use <, not <=, for bitmask loop upper bound [OK]
Common Mistakes:
  • Using <= causes one extra invalid iteration
  • Confusing & with | for bit checking
  • Changing loop indices incorrectly
5. Given a set arr := []int{1, 2, 3, 4}, how many subsets generated by bitmask will have exactly 2 elements?
hard
A. 4
B. 6
C. 8
D. 12

Solution

  1. Step 1: Understand subsets count by size

    Number of subsets of size k from n elements is combination n choose k = C(n, k).
  2. Step 2: Calculate C(4, 2)

    C(4, 2) = 4! / (2! * (4-2)!) = (4*3)/(2*1) = 6.
  3. Final Answer:

    6 -> Option B
  4. Quick Check:

    Number of 2-element subsets = 6 [OK]
Hint: Use combinations formula C(n, k) for subset sizes [OK]
Common Mistakes:
  • Counting all subsets instead of only size 2
  • Using permutations instead of combinations
  • Misapplying formula for combinations
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