|
|
Il problema di calcolare l'n-esimo numero di Fibonacci ammette una soluzione ricorsiva e una soluzione iterativa con complessità molto diverse... Soluzione ricorsivafunction FiboRic(N: LongInt): LongInt;
begin
if(N <= 2) then
FiboRic:=1
else
FiboRic:=FiboRic(N-1)+FiboRic(N-2);
end;
Se consideriamo che il tempo di attesa è proporzionale al numero di chiamate ricorsive allora calcoliamo quest'ultimo valore
Sembra una sequenza strana ma se accettiamo una certa approssimazione
Quindi
Il tempo di attesa è maggiore di un tempo esponenziale, anche se con esponente n/2 piuttosto che n, quindi per n molto grande
Il tempo di attesa per calcolare l'n-esimo numero di Fibonacci, utilizzando l'algoritmo ricorsivo, è esponenziale! Soluzione iterativa
function FiboIter(N: LongInt): LongInt;
Var
I, A, B, C: LongInt;
begin
if(N <= 2) then
FiboIter:=1
else
begin
A:=1;
B:=1;
for I:=3 to N do
begin
C:=A+B;
A:=B;
B:=C;
end;
FiboIter:=C;
end;
end;
Si tratta di un algoritmo con un'iterazione semplice, senza chiamate ricorsive, quindi
Allora il tempo di attesa per calcolare l'n-esimo numero di Fibonacci, utilizzando l'algoritmo iterativo, è lineare! Soluzione con formula
Se consideriamo il tempo necessario per l'elevamento a potenza come costante (...) allora
Quando un problema ammette diversi algoritmi risolutivi è necessario individuare, e utilizzare, quello con complessità minima... Se riusciamo a dimostrare che non può esistere un algoritmo con complessità ancora più bassa allora abbiamo individuato la complessità del problema. |
|