Utilizing memoization and Dijkstra’s Fibonacci algorithm to compute large values
More of an acute fascination than anything else I expanded my use of memoization for computation to use a more efficient means of calculating Fibonacci sequences for values of n greater than 40 (previous Fibonacci example takes several minutes to compute value at 45 and is fairly unusable beyond that). To perform the computing of Fibonacci I utilized Dijkstra's algoritm for graph search pathing (algorithm details can be found in EWD654 "In honor of Fibonacci").
Dijkstra's algorithm for Fibonacci:
D(2n) = (2D(n-1) + D(n))D(n)
D(2n-1) = D(n-1)2 + D(n)2
This algorithm in C#:
public static Func Dijkstra = n =>
{
if( n < 2 )
return n;
double half = ( n % 2 == 0 ) ? n / 2 : ( n / 2 ) + 1;
double p1 = Dijkstra( half );
double p2 = Dijkstra( half - 1 );
double result = default( double );
if( n % 2 == 0 )
result = ( 2 * p2 + p1 ) * p1;
else
result = Math.Pow( p2, 2 ) + Math.Pow( p1, 2 );
return result;
};
Utilizing the memoization technique the amount of computations performed drops significantly. To compute the value of 50 the following computations are performed:
F(50) = F(25) and F(24)
F(25) and F(24) = F(13) and F(12)
F(13) and F(12) = F(7) and F(6)
F(7) and F(6) = F(4) and F(3); F(3) and F(2)
F(4) and F(3) = F(2) and F(1)
F(3) = F(2) and F(1)
F(2) = F(1) and F(0)
F(1) and F(0) are 1 and 0
Utilizing this technique the number of computations required is 14. At the cost of some space the computations become faster as the graph becomes denser.
Technorati Tags: C#,code,tech,software,algorithms