Initial commit 12.1
parent
6063ca4b76
commit
feba60b41e
@ -0,0 +1,26 @@
|
|||||||
|
package _12._1;
|
||||||
|
|
||||||
|
import provided._12._1.Fibonacci;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class FibonacciDynamic extends Fibonacci {
|
||||||
|
protected Map<Integer, Long> map = new HashMap<>();
|
||||||
|
|
||||||
|
public FibonacciDynamic() {
|
||||||
|
this.map.put(0, (long) 0);
|
||||||
|
this.map.put(1, (long) 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long calculate(int n) {
|
||||||
|
if (this.map.containsKey(n)) {
|
||||||
|
return this.map.get(n);
|
||||||
|
} else {
|
||||||
|
long result = calculate(n-1) + calculate(n-2);
|
||||||
|
this.map.put(n, result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
package _12._1;
|
||||||
|
|
||||||
|
|
||||||
|
public class FibonacciDynamicParallel extends FibonacciDynamic {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long calculate(int n) {
|
||||||
|
if (this.map.containsKey(n)) {
|
||||||
|
return this.map.get(n);
|
||||||
|
} else {
|
||||||
|
FibonacciThread thread1 = new FibonacciThread(n-1);
|
||||||
|
FibonacciThread thread2 = new FibonacciThread(n-2);
|
||||||
|
thread1.start();
|
||||||
|
thread2.start();
|
||||||
|
|
||||||
|
try {
|
||||||
|
thread1.join();
|
||||||
|
thread2.join();
|
||||||
|
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
long result = thread1.getResult() + thread2.getResult();
|
||||||
|
this.map.put(n, result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class FibonacciThread extends Thread {
|
||||||
|
private int n;
|
||||||
|
private long result;
|
||||||
|
|
||||||
|
public FibonacciThread(int n) {
|
||||||
|
this.n = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
result = calculate(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getResult() {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
package _12._1;
|
||||||
|
|
||||||
|
import provided._12._1.Fibonacci;
|
||||||
|
|
||||||
|
public class FibonacciParallel extends Fibonacci {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long calculate(int n) {
|
||||||
|
if (n == 0) {
|
||||||
|
return 0;
|
||||||
|
} else if (n == 1) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
FibonacciThread thread1 = new FibonacciThread(n-1);
|
||||||
|
FibonacciThread thread2 = new FibonacciThread(n-2);
|
||||||
|
thread1.start();
|
||||||
|
thread2.start();
|
||||||
|
|
||||||
|
try {
|
||||||
|
thread1.join();
|
||||||
|
thread2.join();
|
||||||
|
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return thread1.getResult() + thread2.getResult();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class FibonacciThread extends Thread {
|
||||||
|
private int n;
|
||||||
|
private long result;
|
||||||
|
|
||||||
|
public FibonacciThread(int n) {
|
||||||
|
this.n = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
result = calculate(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getResult() {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
package _12._1;
|
||||||
|
|
||||||
|
import provided._12._1.Fibonacci;
|
||||||
|
|
||||||
|
public class FibonacciRecursive extends Fibonacci {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long calculate(int n) {
|
||||||
|
if (n == 0) {
|
||||||
|
return 0;
|
||||||
|
} else if (n == 1) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return calculate(n-1) + calculate(n-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,81 @@
|
|||||||
|
package _12._1;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
|
||||||
|
class FibonacciTest {
|
||||||
|
|
||||||
|
private static final int[] NUMBERS = new int[] { 3, 5, 8, 12, 9, 18, 15, 10, 7, 11, 20 };
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void test() {
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
long start;
|
||||||
|
long stop;
|
||||||
|
long time;
|
||||||
|
start = System.nanoTime();
|
||||||
|
FibonacciRecursive r = new FibonacciRecursive();
|
||||||
|
long[] rResult = new long[NUMBERS.length];
|
||||||
|
for (int i : NUMBERS) {
|
||||||
|
rResult[count] = r.calculate(i);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
stop = System.nanoTime();
|
||||||
|
time = (stop - start) / 1000000L;
|
||||||
|
System.out.println("Rekursiv runtime: " + time + " ms");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
start = System.nanoTime();
|
||||||
|
FibonacciParallel p = new FibonacciParallel();
|
||||||
|
long[] pResult = new long[NUMBERS.length];
|
||||||
|
for (int i : NUMBERS) {
|
||||||
|
pResult[count] = p.calculate(i);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
stop = System.nanoTime();
|
||||||
|
time = (stop - start) / 1000000L;
|
||||||
|
System.out.println("Parallel runtime: " + time + " ms");
|
||||||
|
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
start = System.nanoTime();
|
||||||
|
FibonacciDynamic d = new FibonacciDynamic();
|
||||||
|
long[] dResult = new long[NUMBERS.length];
|
||||||
|
for (int i : NUMBERS) {
|
||||||
|
dResult[count] = d.calculate(i);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
stop = System.nanoTime();
|
||||||
|
time = (stop - start) / 1000000L;
|
||||||
|
System.out.println("Dynamic runtime: " + time + " ms");
|
||||||
|
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
start = System.nanoTime();
|
||||||
|
FibonacciDynamicParallel dp = new FibonacciDynamicParallel();
|
||||||
|
long[] dpResult = new long[NUMBERS.length];
|
||||||
|
for (int i : NUMBERS) {
|
||||||
|
dpResult[count] = dp.calculate(i);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
stop = System.nanoTime();
|
||||||
|
time = (stop - start) / 1000000L;
|
||||||
|
System.out.println("Dynamic Parallel runtime: " + time + " ms");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < NUMBERS.length; i++) {
|
||||||
|
assertEquals(rResult[i], pResult[i]);
|
||||||
|
assertEquals(rResult[i], dResult[i]);
|
||||||
|
assertEquals(rResult[i], dpResult[i]);
|
||||||
|
assertEquals(pResult[i], dResult[i]);
|
||||||
|
assertEquals(pResult[i], dpResult[i]);
|
||||||
|
assertEquals(dResult[i], dpResult[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
package provided._12._1;
|
||||||
|
|
||||||
|
public abstract class Fibonacci {
|
||||||
|
|
||||||
|
public abstract long calculate(int n);
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue