|
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 iterativafunction 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(intero più vicino). 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. |
|