BAEL-2504 Combinations
Initial Combinations code.
This commit is contained in:
parent
9f30be503d
commit
7b3da0202e
@ -39,6 +39,11 @@
|
|||||||
<version>${org.assertj.core.version}</version>
|
<version>${org.assertj.core.version}</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.dpaukov</groupId>
|
||||||
|
<artifactId>combinatoricslib3</artifactId>
|
||||||
|
<version>3.3.0</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.baeldung.algorithms.combination;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.apache.commons.math3.util.CombinatoricsUtils;
|
||||||
|
|
||||||
|
public class ApacheCommonsCombinationGenerator {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Iterator<int[]> iterator = CombinatoricsUtils.combinationsIterator(5, 3);
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
final int[] combination = iterator.next();
|
||||||
|
System.out.println(Arrays.toString(combination));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package com.baeldung.algorithms.combination;
|
||||||
|
|
||||||
|
import org.paukov.combinatorics3.Generator;
|
||||||
|
|
||||||
|
public class CombinatoricsLibCombinationGenerator {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Generator.combination(0, 1, 2, 3, 4, 5)
|
||||||
|
.simple(3)
|
||||||
|
.stream()
|
||||||
|
.forEach(System.out::println);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.baeldung.algorithms.combination;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
public class GuavaCombinationsGenerator {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
Set<Set<Integer>> combinations = Sets.combinations(ImmutableSet.of(0, 1, 2, 3, 4, 5), 3);
|
||||||
|
System.out.println(combinations.size());
|
||||||
|
System.out.println(Arrays.toString(combinations.toArray()));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package com.baeldung.algorithms.combination;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class IterativeCombinationGenerator {
|
||||||
|
|
||||||
|
private static final int N = 5;
|
||||||
|
private static final int R = 2;
|
||||||
|
|
||||||
|
public List<int[]> generate(int n, int r) {
|
||||||
|
List<int[]> combinations = new ArrayList<>();
|
||||||
|
int[] combination = new int[r];
|
||||||
|
|
||||||
|
for (int i = 0; i < r; i++) {
|
||||||
|
combination[i] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (combination[r - 1] < n) {
|
||||||
|
combinations.add(combination.clone());
|
||||||
|
|
||||||
|
int t = r - 1;
|
||||||
|
while (t != 0 && combination[t] == n - r + t) {
|
||||||
|
t--;
|
||||||
|
}
|
||||||
|
combination[t]++;
|
||||||
|
for (int i = t + 1; i < r; i++) {
|
||||||
|
combination[i] = combination[i - 1] + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return combinations;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
IterativeCombinationGenerator generator = new IterativeCombinationGenerator();
|
||||||
|
List<int[]> combinations = generator.generate(N, R);
|
||||||
|
System.out.println(combinations.size());
|
||||||
|
for (int[] combination : combinations) {
|
||||||
|
System.out.println(Arrays.toString(combination));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.baeldung.algorithms.combination;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class SelectionRecursiveCombinationGenerator {
|
||||||
|
|
||||||
|
private static final int N = 6;
|
||||||
|
private static final int R = 3;
|
||||||
|
|
||||||
|
public List<int[]> generate(int n, int r) {
|
||||||
|
List<int[]> combinations = new ArrayList<>();
|
||||||
|
helper(combinations, new int[r], 0, n - 1, 0);
|
||||||
|
return combinations;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void helper(List<int[]> combinations, int data[], int start, int end, int index) {
|
||||||
|
if (index == data.length) {
|
||||||
|
int[] combination = data.clone();
|
||||||
|
combinations.add(combination);
|
||||||
|
} else {
|
||||||
|
int max = Math.min(end, end + 1 - data.length + index);
|
||||||
|
for (int i = start; i <= max; i++) {
|
||||||
|
data[index] = i;
|
||||||
|
helper(combinations, data, i + 1, end, index + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SelectionRecursiveCombinationGenerator generator = new SelectionRecursiveCombinationGenerator();
|
||||||
|
List<int[]> combinations = generator.generate(N, R);
|
||||||
|
System.out.println(combinations.size());
|
||||||
|
for (int[] combination : combinations) {
|
||||||
|
System.out.println(Arrays.toString(combination));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
package com.baeldung.algorithms.combination;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class SetRecursiveCombinationGenerator {
|
||||||
|
|
||||||
|
private static final int N = 6;
|
||||||
|
private static final int R = 3;
|
||||||
|
|
||||||
|
public List<int[]> generate(int n, int r) {
|
||||||
|
List<int[]> combinations = new ArrayList<>();
|
||||||
|
helper(combinations, new int[r], 0, n - 1, 0, r);
|
||||||
|
return combinations;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void helper(List<int[]> combinations, int data[], int start, int end, int index, int r) {
|
||||||
|
if (index == data.length) {
|
||||||
|
int[] combination = data.clone();
|
||||||
|
combinations.add(combination);
|
||||||
|
|
||||||
|
} else if (start <= end) {
|
||||||
|
data[index] = start;
|
||||||
|
helper(combinations, data, start + 1, end, index + 1, r);
|
||||||
|
helper(combinations, data, start + 1, end, index, r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SetRecursiveCombinationGenerator generator = new SetRecursiveCombinationGenerator();
|
||||||
|
List<int[]> combinations = generator.generate(N, R);
|
||||||
|
System.out.println(combinations.size());
|
||||||
|
for (int[] combination : combinations) {
|
||||||
|
System.out.println(Arrays.toString(combination));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package com.baeldung.algorithms.combination;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class CombinationUnitTest {
|
||||||
|
|
||||||
|
private static final int N = 5;
|
||||||
|
private static final int R = 3;
|
||||||
|
private static final int nCr = 10;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSetAndSelectionSize_whenCalculatedUsingSetRecursiveAlgorithm_thenExpectedCount() {
|
||||||
|
SetRecursiveCombinationGenerator generator = new SetRecursiveCombinationGenerator();
|
||||||
|
List<int[]> selection = generator.generate(N, R);
|
||||||
|
assertEquals(nCr, selection.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSetAndSelectionSize_whenCalculatedUsingSelectionRecursiveAlgorithm_thenExpectedCount() {
|
||||||
|
SelectionRecursiveCombinationGenerator generator = new SelectionRecursiveCombinationGenerator();
|
||||||
|
List<int[]> selection = generator.generate(N, R);
|
||||||
|
assertEquals(nCr, selection.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSetAndSelectionSize_whenCalculatedUsingIterativeAlgorithm_thenExpectedCount() {
|
||||||
|
IterativeCombinationGenerator generator = new IterativeCombinationGenerator();
|
||||||
|
List<int[]> selection = generator.generate(N, R);
|
||||||
|
assertEquals(nCr, selection.size());
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user