Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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