# Power Set

A power set is a set of all subsets of a set, including empty set and the set itself.

Let’s look at a few examples to understand what that statement really means.

We are at the grocery store, we want to buy apple or banana:

{apple, banana}

• Empty -> {}
• Single item -> {apple}, {banana}
• Two items (everything) -> {apple, banana}

We get 4 subsets.

{apple, banana, carrot}

• Empty (We don’t feel like buying anything)-> {}
• Single item -> {apple}, {banana}, {carrot}
• Two items -> {apple, banana}, {apple, carrot}, {banana, carrot}
• Three items (Give us everything!) -> {apple, banana, carrot}

If we have 3 items, we will get 8 subsets.

If we do it with 1 item, we will get 2 subsets — empty and 1 item(everything) subset. If we do it with 4 items, we will get 16 subsets!

Notice how each time we add 1 item to the set, we will get 2x of subsets that we can get. In another word, the power set of a set is 2 to the power of n, where n is the number of item in the set.

0 item -> 1 subset

1 item -> 2 subsets

2 items -> 4 subsets

3 items -> 8 subsets

4 items -> 16 subsets

5 items -> 32 subsets

If you are thinking, “hey, it’s binary!”, You are absolutely correct!

# Binary

Here is a table to see how our items (a = apple, b = banana, c = carrot) can be mapped to a binary representation.

How do we solve this with code? Let’s think just for a bit.

First, we know that the number of subsets is 2^n. So let’s do that first.

Next, we just have to put in the item to the subset, but how? The hint is in the table above! We are looping from 0 to 2^n. If we have 3 items, we will loop from 0 to 7.

All we have to do is to check whether it is a 1(set bit) or 0(unset bit) at that bit for that number. If it is a 1, we add that item to the subset.

We can use an AND operator to help us for this. Basically, the bitwise AND operator (`&`) returns a `1` in each bit position if the corresponding bits of both binary numbers are `1`s.

We get all 0 for our subset, we won’t be adding any item to the subset, thus we get an empty subset ({})

For the first loop of the inner loop, we get 1 for bit 2⁰, so we will add that item to the subset

You can continue to do this exercise and see everything falls into place.

# Space and Time Complexity

## Space complexity

We are storing 2^n items in the area, so the space complexity would be `O(2^n)`

## Time complexity

The outer loop iterates 2^n times and the inner loop iterates n times, so the time complexity is `O(n*(2^n))`