Esempio : i numeri di Fibonacci



Documenti analoghi
Algoritimi e Strutture Dati Introduzione al corso

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati. Capitolo 1 Un introduzione informale agli algoritmi

Tempo e spazio di calcolo (continua)

Tempo e spazio di calcolo (continua)

Algoritmi e strutture dati

Programmazione dinamica Primi esempi

ESERCITAZIONI DI INTRODUZIONE AGLI ALGORITMI (A.A. 08/09)

Algoritmi. Strutture dati. Strumenti del linguaggio di programmazione

Esercizi di Algoritmi e Strutture Dati

Nozioni di base (II Parte)

I numeri rossi sulla Mole Antonelliana a Natale. Algoritmi e Laboratorio a.a Lezioni. Le regole della riproduzione dei conigli.

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e strutture di dati 2

Algoritmi e Strutture Dati

Introduzione agli algoritmi Prova di esame del 19/9/2016 Prof.sse E. Fachini - R. Petreschi. Parte prima

Esercitazione 7 Algorithmi e Strutture Dati (Informatica) A.A 2015/2016

Ricorsione. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Ricorsione. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Laboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze Informatiche - Cesena A.A

Esercizi di Algoritmi e Strutture Dati

Tecniche di analisi degli algoritmi

Algoritmi e Strutture Dati. Capitolo 10 Tecniche algoritmiche

Algoritmi e Strutture Dati

Si imposti la relazione di ricorrenza che ne descrive la complessità e la si risolva utilizzando il metodo della sostituzione.

Esercizio. 2 i=i*2) j=j*2)

Pensiero Algoritmico. Lezione 3 23 Novembre Ripasso. Anatomia di un programma. Anatomia di un programma. Ozalp Babaoglu Università di Bologna

Programmazione Ricorsione

Tecniche di analisi degli algoritmi

Tempo e spazio di calcolo

Informatica Generale Andrea Corradini Algoritmi: ordinamento per inserimento e ricorsione

Analisi asintotica. Astrazione: come il tempo di esecuzione cresce in funzione della taglia dell input asintoticamente.

liceo B. Russell PROGRAMMAZIONE INDIRIZZO: SCIENTIFICO SCIENZE APPLICATE BIENNIO: SECONDA DISCIPLINA: INFORMATICA

Ricorsione. Libro cap. 5 (da 5.14 in poi)

Tempo e spazio di calcolo

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

La ricorsione. Sommario. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Algoritmi e Strutture Dati. Luciano Gualà

Tecniche di analisi degli algoritmi

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

RICORSIONE. Informatica B - A.A. 2013/2014

Algoritmi e Strutture Dati. Luciano Gualà

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Algoritmi e Strutture Dati. Luciano Gualà

Programmazione ricorsiva

Strutture Merge-Find

T 1 =1. n 6 n. T n =3 T. Esercizio 1 (6 punti)

Tecniche di analisi degli algoritmi

ma può aiutare La ricorsione all opera

n n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita

LA RICORSIONE LA RICORSIONE LA RICORSIONE: ESEMPIO LA RICORSIONE: ESEMPIO LA RICORSIONE: ESEMPIO LA RICORSIONE: ESEMPIO

Esercizi per il corso di Algoritmi, anno accademico 2011/12

Tecniche Algoritmiche: divide et impera

Tecniche Algoritmiche

Costo di esecuzione. Quanto costa? Spazio. Spazio e tempo. Università Roma La Sapienza Corsi di Laurea Informatica/Tecnologie Informatiche

Sommario della Lezione

INFORMATICA A. Titolo presentazione sottotitolo. Laboratorio n 5 Ing. Gian Enrico Conti Dott. Michele Zanella

RICORSIONE RICORSIONE

LA RICORSIONE LA RICORSIONE

LA RICORSIONE! Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento a se stessa

Università degli Studi di Camerino Laurea in Informatica Prima Prova Parziale del corso di Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Corso di Informatica

Appunti lezione Capitolo 13 Programmazione dinamica

Esempio: il fattoriale di un numero fact(n) = n! n!: Z! N n! vale 1 se n " 0 n! vale n*(n-1)! se n > 0. Codifica:

Divide et impera (Divide and Conquer) Dividi il problema in sottoproblemi piu` semplici e risolvili ricorsivamente

Roadmap. Ricorsione: funzioni ricorsive. Definizione di fattoriale. Definizione dei numeri Fibonacci

In questa lezione. Costruire un max-heap. [CLRS01] cap. 6 par Prof. E. Fachini - Intr. Alg.

Operativamente, risolvere un problema con un approccio ricorsivo comporta

Corso di Programmazione

LA RICORSIONE. Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento a se stessa

Algoritmi di ricerca. Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati.

sono le risorse di calcolo necessarie per la sua l esecuzione di un metodo sono tipicamente:

Il principio di induzione. La Ricorsione. Il fattoriale: iterativo. Il fattoriale: ricorsivo. P (0) P (n) P (n + 1) per ogni n

Calcolare il massimo di una lista

11.4 Chiusura transitiva

Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

Ricorsione. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Prova di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE

Per regnare occorre tenere divisi i nemici e trarne vantaggio. fai ad ogni passo la scelta più conveniente

La ricorsione. Induzione nel progetto e nella verifica di programmi ricorsivi. Le forme della ricorsione

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Di cosa parliamo oggi?

Programmazione dinamica

Algoritmi e Strutture Dati

Appendice B. Algoritmi e Complessità

Divide et impera. Divide et impera. Divide et impera. Divide et impera

Ricorsione. Libro cap. 5 (da 5.14 in poi)

Valutazione di progressioni geometriche

Algoritmi e strutture di dati 2

Fondamenti di Informatica

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base

Algoritmi esponenziali

Corso di Algoritmi e Strutture Dati Informatica per il Management Prova Scritta, 18/7/2016

Algoritmi esponenziali

Mergesort. Mergesort. Mergesort. Mergesort. L idea è la seguente: (par. 13.4) dividere l insieme in due parti uguali di n/2 componenti

Transcript:

Esempio : i numeri di Fibonacci La successione di Fibonacci F 1, F 2,... F n,... è definita come: F 1 =1 F 2 =1 F n =F n 1 F n 2,n 2 Leonardo Fibonacci (Pisa, 1170 Pisa, 1250) http://it.wikipedia.org/wiki/leonardo_fibonacci Algoritmi e Strutture Dati 1

Albero di ricorsione F(7)=13 F(6)=8 F(5)=5 F(5)=5 F(4)=3 F(4)=3 F(3)=2 F(4)=3 F(3)=2 F(3)=2 F(2)=1 F(3)=2 F(2)=1 F(2)=1 F(1)=1 F(3)=2 F(2)=1 F(2)=1 F(1)=1 F(2)=1 F(1)=1 F(2)=1 F(1)=1 F(2)=1 F(1)=1 Algoritmi e Strutture Dati 2

Formula chiusa Buona notizia: esiste una semplice formula chiusa per il valore di F n F n = 1 5 n n ove = 1 5 2 1.618 = 1 5 2 0.618 Cattiva notizia: la valutazione di tale formula introduce errori numerici dovuti alla necessità di fare calcoli in virgola mobile Algoritmi e Strutture Dati 3

Algoritmo banale Definiamo un algoritmo per il calcolo dell'n-esimo numero di Fibonacci utilizzando la definizione ricorsiva algoritmo Fibonacci2(int n) int if ( n==1 n==2 ) then return 1; else return Fibonacci2(n-1)+Fibonacci2(n-2); endif L'algoritmo è descritto mediante pseudocodice; la sua traduzione in Java (o qualsiasi altro linguaggio) è immediata Algoritmi e Strutture Dati 4

C'è un piccolo problema... Il tempo necessario per calcolare F n cresce in maniera preoccupante all'aumentare di n D'oh! Algoritmi e Strutture Dati 5

Stima del tempo di esecuzione Misurare il tempo di esecuzione in secondi? Dipende dalla macchina su cui si fanno le misure Misurare il numero di istruzioni in linguaggio macchina eseguite? Anche questo dipende dalla macchina su cui si fanno le misure, e in più è una quantità difficile da desumere a partire dallo pseudocodice Stimiamo il tempo di esecuzione calcolando il numero di operazioni elementari eseguite nello pseudocodice Algoritmi e Strutture Dati 6

Identifichiamo il problema I valori intermedi vengono ricalcolati più volte F(7) F(6) F(5) F(5) F(4) F(4) F(3) F(4) F(3) F(3) F(2) F(3) F(2) F(2) F(1) F(3) F(2) F(2) F(1) F(2) F(1) F(2) F(1) F(2) F(1) Algoritmi e Strutture Dati 7

Stima del tempo di esecuzione Sia T(n) il tempo necessario a calcolare l'n-esimo numero di Fibonacci. Possiamo stimare T(n) come il numero di nodi dell'albero di ricorsione per F n Domanda: dare una espressione ricorsiva del numero T(n) di nodi dell'albero di ricorsione per il calcolo di F n Algoritmi e Strutture Dati 8

Stima del tempo di esecuzione È possibile dimostrare (per induzione) che T(n) = 2F n 1 Domanda: dimostrare la relazione sopra Ricordando la formula chiusa per F n possiamo subito concludere che T(n) cresce in modo esponenziale Possiamo anche calcolare direttamente un limite inferiore a T(n) Vedi pagina successiva Algoritmi e Strutture Dati 9

Stima del tempo di esecuzione algoritmo Fibonacci2(int n) int if ( n==1 n==2 ) then return 1; else return Fibonacci2(n-1)+Fibonacci2(n-2); endif Sia T(n) il numero di nodi dell'albero di ricorsione per il calcolo di F n T(1) = T(2) = 1; T(n) = T(n-1) + T(n-2) + 1 (se n>2) È simile alla relazione di ricorrenza che definisce F n Algoritmi e Strutture Dati 10

Limite inferiore al tempo di esecuzione T n = T n 1 T n 2 1 2T n 2 1 4T n 4 2 1 8T n 6 2 2 2 1... k 1 2 k T n 2k i=0... 2 n/2 2 n/2 1 2 1 2 n/2 2 i Sfruttiamo il fatto che T(n) è monotona crescente La ricorsione termina quando k=n/2 Algoritmi e Strutture Dati 11

Possiamo fare di meglio? Utilizziamo un vettore di lunghezza n per calcolare e memorizzare i valori di F 1, F 2,... F n algoritmo Fibonacci3(int n) int Sia Fib[1..n] un array di n interi Fib[1] := 1; Fib[2] := 1; for i:=3 to n do Fib[i] := Fib[i-1] + Fib[i-2]; endfor return Fib[n]; Algoritmi e Strutture Dati 12

Quanto costa? Stiamiamo il costo dell'algoritmo Fibonacci3 contando le righe di (pseudo-)codice eseguite algoritmo Fibonacci3(int n) int Sia Fib[1..n] un array di n interi Fib[1] := 1; //... 1 volta Fib[2] := 1; //... 1 volta for i:=3 to n do //... (n-1) volte Fib[i] := Fib[i-1] + Fib[i-2]; // (n-2) volte endfor return Fib[n]; //... 1 volta // Totale... 2n - Tempo proporzionale a n - Spazio proporzionale a n Algoritmi e Strutture Dati 13

Possiamo fare di meglio? L'occupazione di memoria di Fibonacci3 è proporzionale a n. Possiamo ridurla? Sì, se osserviamo che per calcolare F n basta ricordare i due valori precedenti F n-1 e F n-2 algoritmo Fibonacci4(int n) int if ( n==1 n==2 ) then return 1; else F_nm1 := 1; F_nm2 := 1; for i:=3 to n do F_n := F_nm1 + F_nm2; F_nm2 := F_nm1; F_nm1 := F_n; endfor return F_n; endif Algoritmi e Strutture Dati 14

Quanto costa? Anche qui, contiamo il numero di righe di codice eseguite algoritmo Fibonacci4(int n) int if ( n==1 n==2 ) then return 1; else F_nm1 := 1; //... 1 volta F_nm2 := 1; //... 1 volta for i:=3 to n do //... (n-1) volte F_n := F_nm1 + F_nm2; //. (n-2) volte F_nm2 := F_nm1; //... (n-2) volte F_nm1 := F_n; //... (n-2) volte endfor return F_n; //... 1 volta endif // Totale... 4n-4 - Tempo proporzionale a n - Spazio costante Algoritmi e Strutture Dati 15

Ora siamo a posto... o no? Consideriamo la matrice A definita come segue: A= 1 1 1 0 Teorema: Per ogni n 2, si ha: A n 1 = 1 1 1 0 n 1 (Si dimostra per induzione) = F n F n 1 F n 1 F n 2 Algoritmi e Strutture Dati 16

Algoritmo Fibonacci6 Sfruttiamo il teorema precedente per descrivere l'algoritmo Fibonacci6 come segue algoritmo Fibonacci6(int n) : int A= 1 1 1 0 M = MatPow( A, n-1 ); return M[1][1]; M[1][1] è il primo elemento della prima riga Algoritmi e Strutture Dati 17

Algoritmo MatPow Per calcolare la potenza di una matrice, sfruttiamo il fatto che, se k è pari, A k = (A k/2 ) 2 algoritmo MatPow(Matrice A, int k) Matrice if ( k==0 ) then M = 1 0 0 1 else if ( k è pari ) then tmp := MatPow(A,k/2) M := tmp '*' tmp; else tmp := MatPow(A,(k-1)/2); M := tmp '*' tmp '*' A; endif endif L'operatore '*' return M; effettua il prodotto di matrici Algoritmi e Strutture Dati 18

Riassunto Tempo Esponenziale Algoritmo Tempo Memoria Fibonacci2 Ω(2 n/2 ) O(n) Fibonacci3 O(n) O(n) Fibonacci4 O(n) O(1) Tempo Logaritmico Fibonacc6 O(log n) O(log n) Algoritmi e Strutture Dati 19

Cosa abbiamo imparato? Per lo stesso problema, siamo partiti da un algoritmo inefficiente (costo esponenziale) per arrivare ad un algoritmo molto efficiente (costo logaritmico) La scelta dell'algoritmo più appropriato fa la differenza tra poter risolvere un problema e NON poterlo risolvere Algoritmi e Strutture Dati 20