diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/powerset/PowerSetUtility.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/powerset/PowerSetUtility.java index fd4c1933f6..336276786a 100644 --- a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/powerset/PowerSetUtility.java +++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/powerset/PowerSetUtility.java @@ -1,7 +1,5 @@ package com.baeldung.powerset; -import com.google.common.collect.Sets; - import javax.annotation.Nullable; import java.util.AbstractSet; import java.util.ArrayList; @@ -163,7 +161,7 @@ public class PowerSetUtility { return unMapIndex(powerSetIndices); } - private List> iterativePowerSetByLoopOverNumbersWithReverseLexicographicalOrder(int n) { + private List> iterativePowerSetByLoopOverNumbers(int n) { List> powerSet = new ArrayList<>(); for (int i = 0; i < (1 << n); i++) { List subset = new ArrayList<>(n); @@ -174,7 +172,7 @@ public class PowerSetUtility { return powerSet; } - private List> iterativePowerSetByLoopOverNumbersWithGrayCodeOrder(int n) { + private List> iterativePowerSetByLoopOverNumbersWithMinimalChange(int n) { List> powerSet = new ArrayList<>(); for (int i = 0; i < (1 << n); i++) { List subset = new ArrayList<>(n); @@ -195,32 +193,16 @@ public class PowerSetUtility { public List> iterativePowerSetByLoopOverNumbers(Set set) { initializeMap(set); - List> sets = iterativePowerSetByLoopOverNumbersWithReverseLexicographicalOrder(set.size()); + List> sets = iterativePowerSetByLoopOverNumbers(set.size()); return unMapListBinary(sets); } public List> iterativePowerSetByLoopOverNumbersMinimalChange(Set set) { initializeMap(set); - List> sets = iterativePowerSetByLoopOverNumbersWithGrayCodeOrder(set.size()); + List> sets = iterativePowerSetByLoopOverNumbersWithMinimalChange(set.size()); return unMapListBinary(sets); } - public static int getRankInLexicographicalOrder(List subset) { - int rank = 0; - for (int i = 0; i < subset.size(); i++) - if (subset.get(i)) - rank += (1 << (subset.size() - i - 1)); - return rank; - } - - public static List getSubsetForRankInLexicographicalOrder(int rank, int sizeOfSet) { - Boolean[] subset = new Boolean[sizeOfSet]; - for(int j = 0; j < sizeOfSet; j++) { - subset[sizeOfSet - j - 1] = ((rank & (1 << j)) > 0); - } - return Arrays.asList(subset); - } - private Set> recursivePowerSetIndexRepresentation(int idx, int n) { if (idx == n) { Set> empty = new HashSet<>(); diff --git a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/powerset/PowerSetUtilityUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/powerset/PowerSetUtilityUnitTest.java index 0a20c36692..8b7c338479 100644 --- a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/powerset/PowerSetUtilityUnitTest.java +++ b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/powerset/PowerSetUtilityUnitTest.java @@ -137,7 +137,7 @@ public class PowerSetUtilityUnitTest { } @Test - public void givenSet_WhenPowerSetIsCalculatedIterativePowerSetByLoopOverNumbersMinimalChange_ThenItContainsAllSubsetsInGrayOrder() { + public void givenSet_WhenPowerSetIsCalculatedIterativePowerSetByLoopOverNumbersWithMinimalChange_ThenItContainsAllSubsets() { Set set = RandomSetOfStringGenerator.generateRandomSet(); List> powerSet = new PowerSetUtility().iterativePowerSetByLoopOverNumbersMinimalChange(set); @@ -172,42 +172,6 @@ public class PowerSetUtilityUnitTest { } } - @Test - public void givenSubset_WhenPowerSetIsInLexicographicalOrder_ReturnCorrectRank() { - int n = new Random().nextInt(5) + 5; //a number in [5, 10) - for(int i = 0; i < ( 1 << n); i++) { - Boolean[] subset = new Boolean[n]; - for(int j=0; j < n; j++) { - subset[n - j - 1] = ((i & (1 << j)) > 0); - } - Assertions.assertEquals(i, PowerSetUtility.getRankInLexicographicalOrder(Arrays.asList(subset))); - } - } - - @Test - public void givenRanking_WhenPowerSetIsInLexicographicalOrder_ReturnTheSubset() { - int n = new Random().nextInt(5) + 5; //a number in [5, 10) - List> powerSet = new ArrayList<>(); - for(int i = 0; i < (1 << n); i++) { - powerSet.add(PowerSetUtility.getSubsetForRankInLexicographicalOrder(i, n)); - } - //To make sure that the size of power set is (2 power n) - MatcherAssert.assertThat(powerSet, IsCollectionWithSize.hasSize((1 << n))); - //To make sure that number of occurrence of each index is (2 power n-1) - Map counter = new HashMap<>(); - for (List subset : powerSet) { - for (int i = 0; i < subset.size(); i++) { - if(subset.get(i)) { - int num = counter.getOrDefault(i, 0); - counter.put(i, num + 1); - } - } - } - counter.forEach((k, v) -> Assertions.assertEquals((1 << (n - 1)), v.intValue())); - //To make sure that one subset is not generated twice - Assertions.assertEquals(powerSet.size(), new HashSet<>(powerSet).size()); - } - static class RandomSetOfStringGenerator { private static List fruits = Arrays.asList("Apples", "Avocados", "Banana", "Blueberry", "Cherry", "Clementine", "Cucumber", "Date", "Fig", "Grapefruit"/*, "Grape", "Kiwi", "Lemon", "Mango", "Mulberry", "Melon", "Nectarine", "Olive", "Orange"*/);