12
Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

Embed Size (px)

Citation preview

Page 1: Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

Problem Set 5: Problem 2

22C:021 Computer Science

Data Structures

Page 2: Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

What needs to be done?

• Implement a Fibonacci Number Generator– A naive Fibonacci number generator

• Implement an optimized Fibonacci number

generator– That remembers results of sub-problems already solved

• Evaluate Performance

Page 3: Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

Fibonacci Number Generator:

Naivepublic static int fibonacci(int n){

if((n == 1) || (n == 2))return 1;

else return fibonacci (n-1) + fibonacci (n-2);

}

Page 4: Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

Fibonacci Number Generator:

Optimized

• We need:– An array “answers” that stores results of solved sub-

problems– A type that can handle large numbers

● Fibonacci numbers grow fast, integers and longs run out of

range– A way to check if a sub-problem has already been

solved– Only need to recurse when necessary

Page 5: Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

The BigInteger Data Type

• Available under java.util namespace• Can store really large values

– Check Java Documentation for more Details about this

type● http://java.sun.com/j2se/1.4.2/docs/api/java/math/

BigInteger.html

Page 6: Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

The “answers” array

• What should be the size of the “answers” array– The size n of this array should be equal to the

Fibonacci number we've been asked to generate– This array stores the nth Fibonacci number at n-1th

Location

private static BigInteger[] answers;

Page 7: Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

Initialize the “answers” array

// Initializing answersint number = <fibonacci number to generate>;

answers = new BigInteger[number];

// The first two numbers in series are 1answers[0] = new BigInteger("1");answers[1] = new BigInteger("1");

// Set all others to zeros to mark them as// not-computedfor(int i = 2; i < number; i++)

answers[i] = new BigInteger("0");

Page 8: Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

Optimized Fibonacci Number

Generatorpublic static BigInteger fastFibonacci(int n){

if((n == 1) || (n == 2))return answers[0];

if(answers[n-1].compareTo(zero) != 0) return answers[n-1];

if(answers[n-2].compareTo(zero) == 0) answers[n-2] = fastFibonacci(n-1);

if(answers[n-3].compareTo(zero) == 0) answers[n-3] = fastFibonacci(n-2);

return answers[n-2].add(answers[n-3]);}

Page 9: Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

Optimized Fibonacci Number

Generator

• When asked to generate a number– We check if the number requested has already been

computed and return it if it has been.– Then, we check if the required numbers have already

been computed (n – 1 and n - 2)– If they have, we straightaway use their values– If they haven't, we call the generator number on each

of the missing required numbers– Once we have both the value, we add them and return

the sum

Page 10: Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

Performance Comparisons

• How fast is the optimized version?– To generate the 46th Fibonacci Number

● The unoptimized version takes 885490.7 ms = Approx 15

minutes● The optimized version takes 0.145 ms

Page 11: Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

Performance Comparison

0.01

0.1

1

10

100

1000

10000

100000

1e+06

1e+07

5 10 15 20 25 30 35 40 45 50

Tim

e (

in m

illise

co

nd

s)

Fibonacci Number

NaiveOptimized

Page 12: Problem Set 5: Problem 2 22C:021 Computer Science Data Structures

Other Performance Stats

• The Optimized version takes– For 100th Number: 0.329 ms– For 1000th Number: 5.172 ms

• The Naive version takes– So long that I did not evaluate ...