Power Set

08 Jul, 2022
Power Set: Power set P(S) of a set S is the set of all subsets of S. For example S = {a, b, c} then P(s) = {{}, {a}, {b}, {c}, {a,b}, {a, c}, {b, c}, {a, b, c}}.If S has n elements in it then P(s) will have 2n elements
Example: 
Set  = [a,b,c]power_set_size = pow(2, 3) = 8Run for binary counter = 000 to 111
Value of Counter            Subset   000                    -> Empty set   001                    -> a   010                    -> b   011                    -> ab   100                    -> c   101                    -> ac   110                    -> bc   111                    -> abc
Algorithm: 
Input: Set[], set_size1. Get the size of power set      powet_set_size = pow(2, set_size)2  Loop for counter from 0 to pow_set_size    (a) Loop for i = 0 to set_size         (i) If ith bit in counter is set                Print ith element from set for this subset   (b) Print separator for subsets i.e., newline
Method 1:For a given set[] S, the power set can be found by generating all binary numbers between 0 and 2n-1, where n is the size of the set. For example, for the set S {x, y, z}, generate all binary numbers from 0 to 23-1 and for each generated number, the corresponding set can be found by considering set bits in the number.
Below is the implementation of the above approach.
C++
C
Java
Python3
C#
PHP
Javascript
// C++ program for the above approach#include <bits/stdc++.h>using namespace std; // Function to print all the power setvoid printPowerSet(char* set, int set_size){    // Set_size of power set of a set with set_size    // n is (2^n-1)    unsigned int pow_set_size = pow(2, set_size);    int counter, j;     // Run from counter 000..0 to 111..1    for (counter = 0; counter < pow_set_size; counter++) {        for (j = 0; j < set_size; j++) {            // Check if jth bit in the counter is set            // If set then print jth element from set            if (counter & (1 << j))                cout << set[j];        }        cout << endl;    }} /*Driver code*/int main(){    char set[] = { 'a', 'b', 'c' };    printPowerSet(set, 3);    return 0;} // This code is contributed by SoM15242
#include <stdio.h>#include <math.h> void printPowerSet(char *set, int set_size){    /*set_size of power set of a set with set_size      n is (2**n -1)*/    unsigned int pow_set_size = pow(2, set_size);    int counter, j;     /*Run from counter 000..0 to 111..1*/    for(counter = 0; counter < pow_set_size; counter++)    {      for(j = 0; j < set_size; j++)       {          /* Check if jth bit in the counter is set             If set then print jth element from set */          if(counter & (1<<j))            printf("%c", set[j]);       }       printf("\n");    }} /*Driver program to test printPowerSet*/int main(){    char set[] = {'a','b','c'};    printPowerSet(set, 3);    return 0;}
// Java program for power setimport java .io.*; public class GFG {         static void printPowerSet(char []set,                            int set_size)    {                 /*set_size of power set of a set        with set_size n is (2**n -1)*/        long pow_set_size =            (long)Math.pow(2, set_size);        int counter, j;             /*Run from counter 000..0 to        111..1*/        for(counter = 0; counter <                pow_set_size; counter++)        {            for(j = 0; j < set_size; j++)            {                /* Check if jth bit in the                counter is set If set then                print jth element from set */                if((counter & (1 << j)) > 0)                    System.out.print(set[j]);            }                         System.out.println();        }    }         // Driver program to test printPowerSet    public static void main (String[] args)    {        char []set = {'a', 'b', 'c'};        printPowerSet(set, 3);    }} // This code is contributed by anuj_67.
# python3 program for power set import math; def printPowerSet(set,set_size):         # set_size of power set of a set    # with set_size n is (2**n -1)    pow_set_size = (int) (math.pow(2, set_size));    counter = 0;    j = 0;         # Run from counter 000..0 to 111..1    for counter in range(0, pow_set_size):        for j in range(0, set_size):                         # Check if jth bit in the            # counter is set If set then            # print jth element from set            if((counter & (1 << j)) > 0):                print(set[j], end = "");        print(""); # Driver program to test printPowerSetset = ['a', 'b', 'c'];printPowerSet(set, 3); # This code is contributed by mits.
// C# program for power setusing System; class GFG {         static void printPowerSet(char []set,                            int set_size)    {        /*set_size of power set of a set        with set_size n is (2**n -1)*/        uint pow_set_size =              (uint)Math.Pow(2, set_size);        int counter, j;             /*Run from counter 000..0 to        111..1*/        for(counter = 0; counter <                   pow_set_size; counter++)        {            for(j = 0; j < set_size; j++)            {                /* Check if jth bit in the                counter is set If set then                print jth element from set */                if((counter & (1 << j)) > 0)                    Console.Write(set[j]);            }                         Console.WriteLine();        }    }         // Driver program to test printPowerSet    public static void Main ()    {        char []set = {'a', 'b', 'c'};        printPowerSet(set, 3);    }} // This code is contributed by anuj_67.
<?php// PHP program for power set function printPowerSet($set, $set_size){     // set_size of power set of    // a set with set_size    // n is (2**n -1)    $pow_set_size = pow(2, $set_size);    $counter; $j;     // Run from counter 000..0 to    // 111..1    for($counter = 0; $counter < $pow_set_size;                                    $counter++)    {        for($j = 0; $j < $set_size; $j++)        {                         /* Check if jth bit in               the counter is set               If set then print               jth element from set */            if($counter & (1 << $j))                echo $set[$j];        }             echo "\n";    }}     // Driver Code    $set = array('a','b','c');    printPowerSet($set, 3); // This code is contributed by Vishal Tripathi?>
<script>// javascript program for power setpublic     function printPowerSet(set, set_size)    {         /*         * set_size of power set of a set with set_size n is (2**n -1)         */        var pow_set_size = parseInt(Math.pow(2, set_size));        var counter, j;         /*         * Run from counter 000..0 to 111..1         */        for (counter = 0; counter < pow_set_size; counter++)        {            for (j = 0; j < set_size; j++)            {                             /*                 * Check if jth bit in the counter is set If set then print jth element from set                 */                if ((counter & (1 << j)) > 0)                    document.write(set[j]);            }            document.write("<br/>");        }    }     // Driver program to test printPowerSet        let set = [ 'a', 'b', 'c' ];        printPowerSet(set, 3); // This code is contributed by shikhasingrajput</script>
a
b
ab
c
ac
bc
abc
Time Complexity: O(n2n)Auxiliary Space: O(1)
Method 2: (sorted by cardinality)
In auxiliary array of bool set all elements to 0. That represent an empty set. Set first element of auxiliary array to 1 and generate all permutations to produce all subsets with one element. Then set the second element to 1 which will produce all subsets with two elements, repeat until all elements are included.
Below is the implementation of the above approach.
C++
Python3
Javascript
// C++ program for the above approach#include <bits/stdc++.h>using namespace std; // Function to print all the power setvoid printPowerSet(char set[], int n){    bool *contain = new bool[n]{0};         // Empty subset    cout << "" << endl;    for(int i = 0; i < n; i++)    {        contain[i] = 1;        // All permutation        do        {            for(int j = 0; j < n; j++)                if(contain[j])                    cout << set[j];            cout << endl;        } while(prev_permutation(contain, contain + n));    }} /*Driver code*/int main(){    char set[] = {'a','b','c'};    printPowerSet(set, 3);    return 0;} // This code is contributed by zlatkodamijanic
# Python3 program for the above approach # A function which gives previous# permutation of the array# and returns true if a permutation# exists.def prev_permutation(str):     # Find index of the last    # element of the string    n = len(str) - 1     # Find largest index i such    # that str[i - 1] > str[i]    i = n    while (i > 0 and str[i - 1] <= str[i]):        i -= 1     # If string is sorted in    # ascending order we're    # at the last permutation    if (i <= 0):        return False     # Note - str[i..n] is sorted    # in ascending order Find    # rightmost element's index    # that is less than str[i - 1]    j = i - 1    while (j + 1 <= n and str[j + 1] < str[i - 1]):        j += 1     # Swap character at i-1 with j    temper = str[i - 1]    str[i - 1] = str[j]    str[j] = temper     # Reverse the substring [i..n]    size = n-i+1    for idx in range(int(size / 2)):        temp = str[idx + i]        str[idx + i] = str[n - idx]        str[n - idx] = temp     return True # Function to print all the power setdef printPowerSet(set, n):     contain = [0 for _ in range(n)]     # Empty subset    print()     for i in range(n):        contain[i] = 1         # To avoid changing original 'contain'        # array creating a copy of it i.e.        # "Contain"        Contain = contain.copy()         # All permutation        while True:            for j in range(n):                if (Contain[j]):                    print(set[j], end="")            print()            if not prev_permutation(Contain):                break # Driver codeset = ['a', 'b', 'c']printPowerSet(set, 3) # This code is contributed by phasing17
// JavaScript program for the above approach // A function which gives previous// permutation of the array// and returns true if a permutation// exists.function prev_permutation(str){       // Find index of the last    // element of the string    let n = str.length - 1;      // Find largest index i such    // that str[i - 1] > str[i]    let i = n;    while (i > 0 && str[i - 1] <= str[i]){        i--;    }             // If string is sorted in    // ascending order we're    // at the last permutation    if (i <= 0){        return false;    }      // Note - str[i..n] is sorted    // in ascending order Find    // rightmost element's index    // that is less than str[i - 1]    let j = i - 1;    while (j + 1 <= n && str[j + 1] < str[i - 1]){        j++;    }         // Swap character at i-1 with j    const temper = str[i - 1];    str[i - 1] = str[j];    str[j] = temper;         // Reverse the substring [i..n]    let size = n-i+1;    for (let idx = 0; idx < Math.floor(size / 2); idx++) {        let temp = str[idx + i];        str[idx + i] = str[n - idx];        str[n - idx] = temp;    }         return true;} // Function to print all the power setfunction printPowerSet(set, n){       let contain = new Array(n).fill(0);     // Empty subset    document.write("<br>");    for(let i = 0; i < n; i++){        contain[i] = 1;                 // To avoid changing original 'contain'        // array creating a copy of it i.e.        // "Contain"        let Contain = new Array(n);        for(let indx = 0; indx < n; indx++){            Contain[indx] = contain[indx];        }         // All permutation        do{            for(let j = 0; j < n; j++){                               if(Contain[j]){                    document.write(set[j]);                }             }            document.write("<br>");                     } while(prev_permutation(Contain));    }} /*Driver code*/const set = ['a','b','c'];printPowerSet(set, 3); // This code is contributed by Gautam goel (gautamgoel962)
a
b
c
ab
ac
bc
abc
Time Complexity: O(n2n)Auxiliary Space: O(n)
Method 3: This method is specific to the python programming language. We can iterate a loop over 0 to the length of the set to obtain and generate all possible combinations of that string with the iterable length. The program below will give the implementation of the above idea.  
Below is the implementation of the above approach.
Python3
#Python program to find powersetfrom itertools import combinationsdef print_powerset(string):    for i in range(0,len(string)+1):        for element in combinations(string,i):            print(''.join(element))string=['a','b','c']print_powerset(string)
a
b
c
ab
ac
bc
abc
Method 4:
We can use backtrack here, we have two choices first consider that element then don’t consider that element. 
Below is the implementation of the above approach.
C++
Java
Python3
C#
#include <bits/stdc++.h>using namespace std; void findPowerSet(char* s, vector<char> &res, int n){        if (n == 0) {            for (auto i: res)              cout << i;            cout << "\n";            return;                     }         res.push_back(s[n - 1]);         findPowerSet(s, res, n - 1);         res.pop_back();                            findPowerSet(s, res, n - 1);    }     void printPowerSet(char* s, int n){    vector<char> ans;    findPowerSet(s, ans, n);}  int main(){    char set[] = { 'a', 'b', 'c' };    printPowerSet(set, 3);    return 0;}
import java.util.*;  class Main{    public static void findPowerSet(char []s, Deque<Character> res,int n){        if (n == 0){          for (Character element : res)             System.out.print(element);          System.out.println();            return;        }        res.addLast(s[n - 1]);        findPowerSet(s, res, n - 1);        res.removeLast();                           findPowerSet(s, res, n - 1);    }      public static void main(String[] args)    {        char []set = {'a', 'b', 'c'};        Deque<Character> res = new ArrayDeque<>();        findPowerSet(set, res, 3);    }}
# Python3 program to implement the approach # Function to build the power setsdef findPowerSet(s, res, n):    if (n == 0):        for i in res:            print(i, end="")        print()        return     # append the subset to result    res.append(s[n - 1])    findPowerSet(s, res, n - 1)    res.pop()    findPowerSet(s, res, n - 1) # Function to print the power setdef printPowerSet(s, n):    ans = []    findPowerSet(s, ans, n) # Driver codeset = ['a', 'b', 'c']printPowerSet(set, 3) # This code is contributed by phasing17
// C# code to implement the approach using System;using System.Collections.Generic; class GFG{    // function to build the power set    public static void findPowerSet(char[] s,                                    List<char> res, int n)    {         // if the end is reached        // display all elements of res        if (n == 0) {            foreach(var element in res)                Console.Write(element);            Console.WriteLine();            return;        }         // append the subset to res        res.Add(s[n - 1]);        findPowerSet(s, res, n - 1);        res.RemoveAt(res.Count - 1);        findPowerSet(s, res, n - 1);    }     // Driver code    public static void Main(string[] args)    {        char[] set = { 'a', 'b', 'c' };        List<char> res = new List<char>();         // Function call        findPowerSet(set, res, 3);    }} // This code is contributed by phasing17
cba
cb
ca
c
ba
b
a
Time Complexity: O(n2^n)
Space Complexity: O(n)
Recursive program to generate power setRefer Power Set in Java for implementation in Java and more methods to print power set.References: http://en.wikipedia.org/wiki/Power_set 
 
vt_m
Mithun Kumar
Aaditya Kulkarni
SoumikMondal
avsadityavardhan
shikhasingrajput
khushboogoyal499
subhammahato348
zlatkodamijanic
gautamgoel962
isha307
phasing17
Snapdeal
Mathematical
Snapdeal
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Program for Fibonacci numbers
Set in C++ Standard Template Library (STL)
Write a program to print all permutations of a given string
C++ Data Types
Merge two sorted arrays
Coin Change | DP-7
Operators in C / C++
Prime Numbers
Program to find GCD or HCF of two numbers
Find minimum number of coins that make a given value