dynamic prog HF
This commit is contained in:
parent
c86f29ccc1
commit
afee59b093
|
@ -0,0 +1,22 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
<orderEntry type="module-library" scope="TEST">
|
||||||
|
<library name="JUnit4">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$APPLICATION_HOME_DIR$/lib/junit-4.12.jar!/" />
|
||||||
|
<root url="jar://$APPLICATION_HOME_DIR$/lib/hamcrest-core-1.3.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES />
|
||||||
|
</library>
|
||||||
|
</orderEntry>
|
||||||
|
</component>
|
||||||
|
</module>
|
|
@ -0,0 +1,41 @@
|
||||||
|
package com.brainbaking.dynamic.sequencing;
|
||||||
|
|
||||||
|
public class LongestCommonSubsequence {
|
||||||
|
|
||||||
|
public String calculate(String a, String b) {
|
||||||
|
int[][] lengths = new int[a.length() + 1][b.length() + 1];
|
||||||
|
char[] as = a.toCharArray();
|
||||||
|
char[] bs = b.toCharArray();
|
||||||
|
|
||||||
|
for(int i = 1; i <= a.length(); i++) {
|
||||||
|
for(int j = 1; j <= b.length(); j++) {
|
||||||
|
|
||||||
|
if(as[i - 1] == bs[j - 1]) {
|
||||||
|
lengths[i][j] = lengths[i - 1][j - 1] + 1;
|
||||||
|
} else {
|
||||||
|
lengths[i][j] = Math.max(lengths[i][j - 1], lengths[i - 1][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return retrace(lengths, as, as.length, bs.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String retrace(int[][] lengths, char[] as, int i, int j) {
|
||||||
|
if(i == 0 || j == 0) return "";
|
||||||
|
|
||||||
|
int l = lengths[i][j];
|
||||||
|
int ltop = lengths[i - 1][j];
|
||||||
|
int lright = lengths[i][j - 1];
|
||||||
|
|
||||||
|
if(ltop == l) {
|
||||||
|
return retrace(lengths, as, i - 1, j);
|
||||||
|
} else if(lright == l) {
|
||||||
|
return retrace(lengths, as, i, j - 1);
|
||||||
|
} else {
|
||||||
|
return retrace(lengths, as, i - 1, j - 1) + as[i - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.brianbaking.dynamic.fibo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface Fiboable {
|
||||||
|
|
||||||
|
List<Integer> calculate(int count);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package com.brianbaking.dynamic.fibo;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class NaiveFibonacci implements Fiboable {
|
||||||
|
|
||||||
|
public List<Integer> calculate(int count) {
|
||||||
|
List<Integer> nrs = new ArrayList<>();
|
||||||
|
nrs.add(0);
|
||||||
|
nrs.add(1);
|
||||||
|
|
||||||
|
for(int i = 2; i <= count; i++) {
|
||||||
|
nrs.add(nrs.get(i - 1) + nrs.get(i - 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
return nrs;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.brianbaking.dynamic.fibo;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public class RecursiveFibo implements Fiboable {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Integer> calculate(int count) {
|
||||||
|
ArrayList<Integer> list = new ArrayList<>();
|
||||||
|
list.addAll(Arrays.asList(0, 1));
|
||||||
|
calculateRecursively(2, count, list);
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void calculateRecursively(int index, int count, List<Integer> list) {
|
||||||
|
if(index <= count) {
|
||||||
|
list.add(list.get(index - 1) + list.get(index - 2));
|
||||||
|
calculateRecursively(index + 1, count, list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.brainbaking.dynamic.fibo;
|
||||||
|
|
||||||
|
import com.brianbaking.dynamic.fibo.Fiboable;
|
||||||
|
import com.brianbaking.dynamic.fibo.NaiveFibonacci;
|
||||||
|
import com.brianbaking.dynamic.fibo.RecursiveFibo;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static junit.framework.TestCase.assertEquals;
|
||||||
|
|
||||||
|
public class FibonacciTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void calculateNaive() {
|
||||||
|
testFibo(new NaiveFibonacci());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void calculateRecursively() {
|
||||||
|
testFibo(new RecursiveFibo());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testFibo(Fiboable fibo) {
|
||||||
|
String result = fibo.calculate(10).stream().map(i -> i.toString()).collect(Collectors.joining(","));
|
||||||
|
|
||||||
|
assertEquals("0,1,1,2,3,5,8,13,21,34,55", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.brainbaking.dynamic.sequencing;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static junit.framework.TestCase.assertEquals;
|
||||||
|
|
||||||
|
public class LongestCommonSubsequenceTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void longestCommonSubSequence() {
|
||||||
|
LongestCommonSubsequence sequencer = new LongestCommonSubsequence();
|
||||||
|
|
||||||
|
String result = sequencer.calculate("ABCBDAB", "BDCABA");
|
||||||
|
|
||||||
|
assertEquals("BCBA", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue