Enumerating All Subsets

Using bitmasks for subset enumeration.

A subset of nn elements can be represented as an nn-bit integer. Bit ii is 11 if element ii is included.

for mask from 0 to 2^n - 1:
    subset = []
    for i from 0 to n-1:
        if mask & (1 << i):
            subset.add(elements[i])
    // process subset

Example: n=3n = 3, elements [a,b,c][a, b, c].

  • mask =0= 0 (binary 000000): [][]
  • mask =1= 1 (binary 001001): [a][a]
  • mask =5= 5 (binary 101101): [a,c][a, c]
  • mask =7= 7 (binary 111111): [a,b,c][a, b, c]

Time: O(n2n)O(n \cdot 2^n). Generate all 2n2^n subsets, each takes O(n)O(n) to process.