Power Set | GeeksforGeeks


Power Set | GeeksforGeeks
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 2^n elements
Time Complexity: O(n2^n)
1. 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 seperator for subsets i.e., newline
Binary String
http://www.geeksforgeeks.org/finding-all-subsets-of-a-given-set-in-java/
    // Print all subsets of given set[]
    static void printSubsets(char set[])
    {
        int n = set.length;
        // Run a loop for printing all 2^n
        // subsets one by obe
        for (int i = 0; i < (1<<n); i++)
        {
            System.out.print("{ ");
            // Print current subset
            for (int j = 0; j < n; j++)
                // (1<<j) is a number with jth bit 1
                // so when we 'and' them with the
                // subset number we get which numbers
                // are present in the subset and which
                // are not
                if ((i & (1 << j)) > 0)
                    System.out.print(set[j] + " ");
            System.out.println("}");
        }
    }
http://www.zrzahid.com/power-set-or-super-set-of-a-list/
Notice that, if we represent each unique letters by a bit position in a n bit integer than the power set will look like, for example for n=3,
{}    ->  000
{a}   ->  001
{b}   ->  010
{c}   ->  100
{a, b} -> 011
{b, c} -> 110
{a, c} -> 101
{a,b,c}-> 111
That is we can generate the power set of n numbers by looking at the bit positions n bit integers. So, we will basically take each integer from 0 to 2^n-1 and for each we will check the bit positions set. Each number corresponds to a set in the superset and each set bit position will contribute to an element in the set. Below is the implementation of this idea which runs in O(n*2^n) time and O(1) space.
public static List<List<Character>> powerSet(char[] chars){
 int n = chars.length;
 List<List<Character>> powerSet = new ArrayList<List<Character>>();
 //superSet.add(Collections.emptyList());
 
 if(n == 0){
  return powerSet;
 }
 
 int max = (int)Math.pow(2, n);
 for(int i = 0; i<max; i++){
  List<Character> set = new ArrayList<Character>();
  for(int j = 0; j<n; j++){
   if((i & (1<<j)) > 0){
    set.add(chars[j]);
   }
  }
  powerSet.add(set);
 }
 
 return powerSet;
}


public static <T extends Comparable<? super T>> LinkedList<LinkedList<T>> BinPowSet(
  LinkedList<T> A){
 LinkedList<LinkedList<T>> ans= new LinkedList<LinkedList<T>>();
 int ansSize = (int)Math.pow(2, A.size());
 for(int i= 0;i< ansSize;++i){
  String bin= Integer.toBinaryString(i); //convert to binary
  while(bin.length() < A.size()) bin = "0" + bin; //pad with 0's
  LinkedList<T> thisComb = new LinkedList<T>(); //place to put one combination
  for(int j= 0;j< A.size();++j){
   if(bin.charAt(j) == '1')thisComb.add(A.get(j));
  }
  Collections.sort(thisComb); //sort it for easy checking
  ans.add(thisComb); //put this set in the answer list
 }
 return ans;
}
http://algorithms.tutorialhorizon.com/print-all-the-subsets-of-a-given-set-power-set/
Recursive: Include or exclude.
    public void combinations(int[] A, int x) {
        if (x == A.length - 1) {
            A[x] = 0; // last digit, don't select it
            printArray(A); // print the set
            A[x] = 1; //// last digit, select it
            printArray(A);
            return;
        }
        A[x] = 0;   //either you will not select this digit
        combinations(A, x + 1);
        A[x] = 1//either you will select this digit
        combinations(A, x + 1);
    }
    public void printArray(int[] A) {
        boolean isNULL = true;
        System.out.print("{");
        for (int i = 0; i < B.length; i++) {
            if (A[i] == 1) {
                System.out.print(B[i] + "");
                isNULL = false;
            }
        }
        if (isNULL == false) {
            System.out.print("}");
            System.out.print("  ");
        }  
        if (isNULL) {
            System.out.print("Empty");
            System.out.print("} ");
        }
    }
http://rosettacode.org/wiki/Power_set#Java
Iterative:
 
public static <T> List<List<T>> powerset(Collection<T> list) {
  List<List<T>> ps = new ArrayList<List<T>>();
  ps.add(new ArrayList<T>());   // add the empty set
 
  // for every item in the original list
  for (T item : list) {
    List<List<T>> newPs = new ArrayList<List<T>>();
 
    for (List<T> subset : ps) {
      // copy all of the current powerset's subsets
      newPs.add(subset);
 
      // plus the subsets appended with the current item
      List<T> newSubset = new ArrayList<T>(subset);
      newSubset.add(item);
      newPs.add(newSubset);
    }
 
    // powerset is now powerset of list.subList(0, list.indexOf(item)+1)
    ps = newPs;
  }
  return ps;
}
https://gist.github.com/lostMohican/4a768cbe74e0eed0c00e
public static Set<Set<Integer>> findPowerSet(Set<Integer> orgs) {
    Set<Set<Integer>> power = new HashSet<>();
    power.add(new HashSet<>()); //empty?


    for (Integer i : orgs) {
        Set<Set<Integer>> temp = new HashSet<>();
        for (Set<Integer> subSets : power) {
            Set<Integer> cur = new HashSet<Integer>(subSets);
            cur.add(i);
            temp.add(cur);
        }
        power.addAll(temp);
    }

    return power;
}
http://comproguide.blogspot.com/2013/10/program-to-find-powerset-of-given-set.html


Arraylist<Arraylist<Integer> > getSubsets(Arraylist<Integer> set, int index) {
        Arraylist<Arraylist<Integer> > allsubsets;
        if (set.size()== index) {//Base case - add empty set
                allsubsets = new Arraylist<Arraylist<Integer> >();
                allsubsets.add(new Arraylist<Integer>()); // Empty set
        } else {
                allsubsets = getSubsets(set, index+ 1);
                int item= set.get(index);
                Arraylist<Arraylist<Integer> > moresubsets
                new Arraylist<Arraylist<Integer> >();
                for (Arraylist<Integer> subset : allsubsets) {
                        Arraylist<Integer> newsubset = new Arraylist<Integer>();
                        newsubset.addAll(subset); //
                        newsubset.add(item);
                        moresubsets.add(newsubset);
                }
                allsubsets.addAll(moresubsets);
        }
        return allsubsets;
}

Recall that when we're generating a set, we have two choices for each element: (1) the element is in the set (the "yes" state) or (2) the element is not in the set (the "no" state). This means that each subset is a sequence of yeses I nos-e.g., "yes, yes, no, no, yes, no"

Arraylist<Arraylist<Integer> > getSubsets2(ArrayList<Integer> set) {
        ArrayList<ArrayList<Integer> > allsubsets = new Arraylist<Arraylist<Integer> >();
        int max= 1 << set.size(); /* Compute 2An */
        for (int k = 0; k < max; k++ ) {
                ArrayList<Integer> subset= convertintToSet(k, set);
                allsubsets.add(subset);
        }
        return allsubsets;
}
Arraylist<Integer> convertlntToSet(int x, Arraylist<Integer> set) {
        Arraylist<Integer> subset = new Arraylist<Integer>();
        int index = 0;
        for (int k = x; k > 0; k >>= 1) {
                if ((k & 1) == 1) {
                        subs et.add(set.get(index));
                }
                index++;
        }
        return subset;
}

http://www.geeksforgeeks.org/find-distinct-subsets-given-set/
Given a set of positive integers, find all its subsets. The set can contain duplicate elements, so any repeated subset should be considered only once in the output.
Examples:
Input:  S = {1, 2, 2}
Output:  {}, {1}, {2}, {1, 2}, {2, 2}, {1, 2, 2}
The idea is to use a bit-mask pattern to generate all the combinations as discussed in previous post. But previous post will print duplicate subsets if the elements are repeated in the given set. To handle duplicate elements, we construct a string out of given subset such that subsets having similar elements will result in same string. We maintain a list of such unique strings and finally we decode all such string to print its individual elements.
// Utility function to split the string using a delim. Refer -
vector<string> split(const string &s, char delim)
{
    vector<string> elems;
    stringstream ss(s);
    string item;
    while (getline(ss, item, delim))
        elems.push_back(item);
    return elems;
}
// Function to find all subsets of given set. Any repeated
// subset is considered only once in the output
int printPowerSet(int arr[], int n)
{
    vector<string> list;
    /* Run counter i from 000..0 to 111..1*/
    for (int i = 0; i < (int) pow(2, n); i++)
    {
        string subset = "";
        // consider each element in the set
        for (int j = 0; j < n; j++)
        {
            // Check if jth bit in the i is set. If the bit
            // is set, we consider jth element from set
            if ((i & (1 << j)) != 0)
                subset += to_string(arr[j]) + "|";
        }
        // if subset is encountered for the first time
        // If we use set<string>, we can directly insert
        if (find(list.begin(), list.end(), subset) == list.end())
            list.push_back(subset);
    }
    // consider every subset
    for (string subset : list)
    {
        // split the subset and print its elements
        vector<string> arr = split(subset, '|');
        for (string str: arr)
            cout << str << " ";
        cout << endl;
    }
}
http://www.geeksforgeeks.org/subarraysubstring-vs-subsequence-and-programs-to-generate-them/
For an array of size n, we have 2^n sub-sequences (including empty) in total. Observe, in total 2nsub-sequences, each elements occurs 2n-1 times.
Given an array of integers. The task is to find the sum of sum of each of sub-sequence of the array.
int sum(int arr[], int n)
{
  int ans = 0;
 
  // Finding sum of the array.
  for (int i = 0; i < n; i++)
    ans += arr[i];
 
  return ans * pow(2, n - 1);
}
Read full article from Power Set | GeeksforGeeks

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts