Ho appena provato a implementare il codice (in Java) per vari modi con cui è possibile calcolare l'ennesimo termine della sequenza di Fibonacci e spero di verificare ciò che ho imparato.Big-O per varie implementazioni di Fibonacci
L'implementazione iterativa è la seguente:
public int iterativeFibonacci(int n)
{
if (n == 1) return 0;
else if (n == 2) return 1;
int i = 0, j = 1, sum = 0;
for (; (n-2) != 0; --n)
{
sum = i + j;
i = j;
j = sum;
}
return sum;
}
L'implementazione ricorsiva è la seguente: -
public int recursiveFibonacci(int n)
{
if (n == 1) return 0;
else if (n == 2) return 1;
return recursiveFibonacci(n-1) + recursiveFibonacci(n-2);
}
L'implementazione memoized è la seguente: -
public int memoizedFibonacci(int n)
{
if (n <= 0) return -1;
else if (n == 1) return 0;
else if (n == 2) return 1;
if (memory[n-1] == 0)
memory[n-1] = memoizedFibonacci(n-1);
if (memory[n-2] == 0)
memory[n-2] = memoizedFibonacci(n-2);
return memory[n-1]+memory[n-2];
}
I' Ho un po 'di dubbio quando cerco di capire il Big-O di queste implementazioni. Credo che l'implementazione iterativa sia O (n) mentre scorre in N-2 volte.
Nella funzione ricorsiva, ci sono valori ricalcolate, quindi penso sia O (n^2).
Nella funzione memoized, più della metà dei valori è accessibile in base alla memoizzazione. Ho letto che un algoritmo è O (log N) se ci vuole tempo costante per ridurre lo spazio del problema di una frazione e che un algoritmo è O (N) se ci vuole tempo costante per ridurre lo spazio del problema da un importo costante. Ho ragione nel ritenere che l'implementazione memorizzata sia O (n) in complessità? In tal caso, l'implementazione iterativa non sarebbe la migliore tra tutte e tre? (poiché non utilizza la memoria aggiuntiva richiesta dalla memoizzazione).
I problemi di recidiva lineare come questi nelle competizioni di programmazione sono solitamente risolti tramite "esponenziazione della matrice". C'è un esempio in C++ per le serie di Fibonacci in questo [blogpost] (http://fusharblog.com/solving-linear-recurrence-for-programming-contest/). – plesiv