From afee59b093fe420e537bb153d56c48123916eb24 Mon Sep 17 00:00:00 2001 From: wgroeneveld Date: Fri, 30 Mar 2018 16:13:11 +0200 Subject: [PATCH] dynamic prog HF --- dynamicprogramming/java/dynamicprog.iml | 22 ++++++++++ .../sequencing/LongestCommonSubsequence.java | 41 +++++++++++++++++++ .../brianbaking/dynamic/fibo/Fiboable.java | 9 ++++ .../dynamic/fibo/NaiveFibonacci.java | 19 +++++++++ .../dynamic/fibo/RecursiveFibo.java | 24 +++++++++++ .../dynamic/fibo/FibonacciTest.java | 30 ++++++++++++++ .../LongestCommonSubsequenceTest.java | 18 ++++++++ 7 files changed, 163 insertions(+) create mode 100644 dynamicprogramming/java/dynamicprog.iml create mode 100644 dynamicprogramming/java/src/com/brainbaking/dynamic/sequencing/LongestCommonSubsequence.java create mode 100644 dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/Fiboable.java create mode 100644 dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/NaiveFibonacci.java create mode 100644 dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/RecursiveFibo.java create mode 100644 dynamicprogramming/java/test/com/brainbaking/dynamic/fibo/FibonacciTest.java create mode 100644 dynamicprogramming/java/test/com/brainbaking/dynamic/sequencing/LongestCommonSubsequenceTest.java diff --git a/dynamicprogramming/java/dynamicprog.iml b/dynamicprogramming/java/dynamicprog.iml new file mode 100644 index 0000000..9991225 --- /dev/null +++ b/dynamicprogramming/java/dynamicprog.iml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dynamicprogramming/java/src/com/brainbaking/dynamic/sequencing/LongestCommonSubsequence.java b/dynamicprogramming/java/src/com/brainbaking/dynamic/sequencing/LongestCommonSubsequence.java new file mode 100644 index 0000000..e0177c6 --- /dev/null +++ b/dynamicprogramming/java/src/com/brainbaking/dynamic/sequencing/LongestCommonSubsequence.java @@ -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]; + } + + } + +} diff --git a/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/Fiboable.java b/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/Fiboable.java new file mode 100644 index 0000000..d7b6dc5 --- /dev/null +++ b/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/Fiboable.java @@ -0,0 +1,9 @@ +package com.brianbaking.dynamic.fibo; + +import java.util.List; + +public interface Fiboable { + + List calculate(int count); + +} diff --git a/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/NaiveFibonacci.java b/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/NaiveFibonacci.java new file mode 100644 index 0000000..6b8e6fe --- /dev/null +++ b/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/NaiveFibonacci.java @@ -0,0 +1,19 @@ +package com.brianbaking.dynamic.fibo; + +import java.util.ArrayList; +import java.util.List; + +public class NaiveFibonacci implements Fiboable { + + public List calculate(int count) { + List 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; + } +} diff --git a/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/RecursiveFibo.java b/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/RecursiveFibo.java new file mode 100644 index 0000000..c095d1f --- /dev/null +++ b/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/RecursiveFibo.java @@ -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 calculate(int count) { + ArrayList list = new ArrayList<>(); + list.addAll(Arrays.asList(0, 1)); + calculateRecursively(2, count, list); + return list; + } + + private void calculateRecursively(int index, int count, List list) { + if(index <= count) { + list.add(list.get(index - 1) + list.get(index - 2)); + calculateRecursively(index + 1, count, list); + } + } +} diff --git a/dynamicprogramming/java/test/com/brainbaking/dynamic/fibo/FibonacciTest.java b/dynamicprogramming/java/test/com/brainbaking/dynamic/fibo/FibonacciTest.java new file mode 100644 index 0000000..87f9399 --- /dev/null +++ b/dynamicprogramming/java/test/com/brainbaking/dynamic/fibo/FibonacciTest.java @@ -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); + } + +} diff --git a/dynamicprogramming/java/test/com/brainbaking/dynamic/sequencing/LongestCommonSubsequenceTest.java b/dynamicprogramming/java/test/com/brainbaking/dynamic/sequencing/LongestCommonSubsequenceTest.java new file mode 100644 index 0000000..274f5a3 --- /dev/null +++ b/dynamicprogramming/java/test/com/brainbaking/dynamic/sequencing/LongestCommonSubsequenceTest.java @@ -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); + } + +}