Difference between revisions of "Fibonacci"
Line 56: | Line 56: | ||
{{Work|<math>n</math>}} | {{Work|<math>n</math>}} | ||
− | |||
==DynamicIterativeSequentialFibonacciCalculator== | ==DynamicIterativeSequentialFibonacciCalculator== | ||
{{CodeToImplement|DynamicIterativeSequentialFibonacciCalculator|fibonacci|fibonacci.studio}} | {{CodeToImplement|DynamicIterativeSequentialFibonacciCalculator|fibonacci|fibonacci.studio}} | ||
− | + | {{Work|<math>n</math>}} | |
==LinearRecurrenceSequentialFibonacciCalculator== | ==LinearRecurrenceSequentialFibonacciCalculator== | ||
{{CodeToImplement|LinearRecurrenceSequentialFibonacciCalculator|fibonacci|fibonacci.studio}} | {{CodeToImplement|LinearRecurrenceSequentialFibonacciCalculator|fibonacci|fibonacci.studio}} |
Revision as of 20:42, 5 February 2018
Contents
- 1 Motivation
- 2 Background
- 3 Common Mistakes To Avoid
- 4 Studio (Required)
- 5 Fun (Optional)
- 6 Testing Your Solution
Motivation
It is important to always reduce the work, then parallelize if possible. In this studio you will build a beautiful, elegant solution to Fibonacci which can be easily parallelized yielding off-the-charts ideal parallelism. Sadly, it performs terribly since the work is exponential . It is far better to build a linear time or log time algorithm independent of if can or cannot be parallelized.
We will gain experience with the future construct.
We will convert recurrence relations into code.
Additionally, (and of minor importance) we gain experience working with the BigInteger class.
Background
The fibonacci sequence is a mathematical concept often used in computer science as a means to demonstrate iteration and recursion. Although you should be familiar with it from CSE 131, we will use the fibonacci sequence to demonstrate memoization and dynamic programming. Follow these links for a quick recap on memoization, dynamic programming, and the fibonacci sequence.
Javadocs
Common Mistakes To Avoid
Warning: The entire point of memoization is to avoid recalculating the same computation. Be sure to store the value for each calculation as it is made even if that means splitting up a line of code. |
Studio (Required)
RecurrenceRelationSequentialFibonacciCalculator
class: | RecurrenceRelationSequentialFibonacciCalculator.java | |
methods: | fibonacci | |
package: | fibonacci.studio | |
source folder: | student/src/main/java |
implement a recursive method for:
recurrence relation
seed values
Work: |
RecurrenceRelationParallelFibonacciCalculator
class: | RecurrenceRelationParallelFibonacciCalculator.java | |
methods: | fibonacci | |
package: | fibonacci.studio | |
source folder: | student/src/main/java |
Use futures to add parallelism to the recurrence relation solution.
Work: | |
CPL: | |
Ideal Parallelism: |
MemoizationSequentialFibonacciCalculator
class: | MemoizationSequentialFibonacciCalculator.java | |
methods: | fibonacciMemo | |
package: | fibonacci.studio | |
source folder: | student/src/main/java |
Implement the recurrence relation algorithm but employ memoization for the win.
@Override public BigInteger fibonacci(int n) { BigInteger[] memos = new BigInteger[n + 1]; return fibonacciMemo(memos, n); }
Work: |
DynamicIterativeSequentialFibonacciCalculator
class: | DynamicIterativeSequentialFibonacciCalculator.java | |
methods: | fibonacci | |
package: | fibonacci.studio | |
source folder: | student/src/main/java |
Work: |
LinearRecurrenceSequentialFibonacciCalculator
class: | LinearRecurrenceSequentialFibonacciCalculator.java | |
methods: | fibonacci | |
package: | fibonacci.studio | |
source folder: | student/src/main/java |
recurrence relation
- if n is odd
- else
seed values
Work: |
Fun (Optional)
DynamicRecursiveSequentialFibonacciCalculator
MemoizationParallelFibonacciCalculator
Create all of your futures [0..N] up front and then call get on memo[n].
RoundPhiToTheNOverSqrt5SequentialFibonacciCalculator
Testing Your Solution
Correctness
class: | FibonacciTestSuite.java | |
package: | fibonacci.studio | |
source folder: | testing/src/test/java |
Performance
class: | FibonacciIterations.java | |
package: | fibonacci.studio | |
source folder: | src/main/java |