Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Algoritmi
Tipi di dato semplici
File
Puntatori
Funzioni
Argomenti corso
Algoritmi
Liste
Pile
Code
Argomenti corso
Algoritmi su liste
Algoritmi su pile
Algoritmi su code
Argomenti corso
Algoritmi
Strutture dati
Strutture dati
Algoritmi
Strutture dati
Leonardo da Pisa si interess di molte cose, tra cui il seguente problema di dinamica delle popolazioni:
Le regole di riproduzione
Una coppia di conigli genera due coniglietti ogni anno
I conigli cominciano a riprodursi soltanto al secondo anno dopo la loro nascita
La regola di espansione
Nellanno n, ci sono tutte le coppie dellanno precedente, e una nuova coppia di conigli per ogni coppia presente due anni prima. Indicando con Fn il numero di coppie dellanno n, abbiamo la seguente relazione di ricorrenza:
Fn =
Il problema
Come calcoliamo Fn ?
Un approccio numerico
Possiamo usare una funzione matematica che calcoli direttamente i numeri di Fibonacci. Si pu dimostrare che:
dove:
Algoritmo fibonacci1
Correttezza?
Qual laccuratezza su e per ottenere un risultato corretto? Ad esempio, con 3 cifre decimali:
f i b o n a c c i 1 (n)
arrotondamento
Fn
3 16 18
2 987 2583
2 987 2584
Algoritmo fibonacci2
Poich fibonacci1 non corretto, un approccio alternativo consiste nellutilizzare direttamente la definizione ricorsiva:
Algoritmo fibonacci3
Perch lalgoritmo fibonacci2 lento? Perch continua a ricalcolare ripetutamente la soluzione dello stesso sottoproblema.
algoritmo fibonacci3(intero n) intero sia Fib un array di n interi Fib[1] Fib[2] 1 for i = 3 to n do Fib[i] Fib[i-1] + Fib[i-2] return Fib[n]
Occupazione di memoria
Il tempo di esecuzione non la sola risorsa di calcolo che ci interessa. Anche la quantit di memoria necessaria pu essere cruciale. Se abbiamo un algoritmo lento (non troppo), dovremo solo attendere pi a lungo per ottenere il risultato. Ma se un algoritmo richiede pi spazio di quello a disposizione, non otterremo mai la soluzione, indipendentemente dal tempo di attesa.
Algoritmo fibonacci4
fibonacci3 usa un array di dimensione n.
In realt non ci serve mantenere tutti i valori di Fn precedenti, ma solo gli ultimi due, riducendo lo spazio a poche variabili in tutto:
algoritmo fibonacci4(intero n) intero ab1 a rappresenta Fib[i-2] for i = 3 to n do c a+b b rappresenta Fib[i-1] ab bc c rappresenta Fib[i] return b
Potenze ricorsive
fibonacci4 non il miglior algoritmo possibile.
E possibile dimostrare per induzione la seguente propriet di matrici:
Algoritmo fibonacci5
PSEUDOCODICE !
Calcolo di potenze
Possiamo calcolare la n-esima potenza elevando al quadrato la (n/2)-esima potenza. Se n dispari eseguiamo una ulteriore moltiplicazione Esempio: 32=9
34 =(32)2=(9)2 =81
38=(34)2=(81)2 =6561
Algoritmo fibonacci6
Tutto il tempo richiesto da fibonacci6 speso nella funzione potenzaDiMatrice che calcola ricorsivamente la potenza della matrice elevando al quadrato la sua potenza (n/2)-esima.
Riepilogo
Tempo di esecuzione Occupazione di memoria
fibonacci2
fibonacci3 fibonacci4 fibonacci5 fibonacci6
O(n)
O(n) O(1) O(1) O(log n)
O(n)
O(log n)
Morale
Progettare algoritmi efficienti pu avere un effetto drammatico sullincremento delle prestazioni.
(Ricordiamoci, ad esempio, che se n vale un miliardo log2n sar pari a 30 !!!)
Come misurare lefficienza di un algoritmo? q.t tempo di calcolo (tempo di CPU) indipendente dalle tecnologie e dalle piattaforme q.t spazio Non vogliamo valutare i dettagli della particolare istanza del problema, ma riferirci alla dimensione dellistanza di ingresso. Una stima dellordine di grandezza pu darci le informazioni necessarie (notazione asintotica).