Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere...

36
Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido Proietti Email: [email protected] URL: www.di.univaq.it/~proietti/index_person al 1

Transcript of Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere...

Page 1: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Didattica e Fondamenti degli Algoritmi e della

Calcolabilità

Quarta giornataRisolvere efficientemente un problema in P: la sequenza di

FibonacciGuido Proietti

Email: [email protected]:

www.di.univaq.it/~proietti/index_personal

1

Page 2: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Riepilogo: gerarchia delle classi

2

Decidibili

ExpTime(ARRESTO(k))P (ricerca)

NP

NP-completi (SAT)

Congettura P ≠ NP

Page 3: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Progettare un algoritmo

Vogliamo ora progettare algoritmi (per problemi calcolabili!) che:– Producano correttamente il risultato

desiderato– Siano efficienti in termini di tempo di

esecuzione ed occupazione di memoria

3

Page 4: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Le quattro proprietà fondamentali di un algoritmo (oltre l’efficienza)

• La sequenza di istruzioni deve essere finita • Essa deve portare ad un risultato corretto • Le istruzioni devono essere eseguibili

materialmente • Le istruzioni non devono essere ambigue

4

Page 5: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Algoritmi e strutture dati

• Concetto di algoritmo è inscindibile da quello di dato

• Da un punto di vista computazionale, un algoritmo è una procedura che prende dei dati in input e, dopo averli elaborati, restituisce dei dati in output

I dati devo essere organizzati e strutturati in modo tale che la procedura che li elabora sia “efficiente”

5

Page 6: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Analisi di algoritmi Correttezza:

– dimostrare formalmente che un algoritmo è corretto

Complessità:– Stimare la quantità di risorse (tempo e

memoria) necessarie all’algoritmo– stimare il più grande input gestibile in tempi

ragionevoli– confrontare due algoritmi diversi– ottimizzare le parti “critiche”

6

Page 7: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl7

Un problema numerico «giocattolo»:

i numeri di Fibonacci

Page 8: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl8

Leonardo da Pisa (anche noto come Fibonacci) [1170-1240] si interessò di molte cose, tra cui il seguente problema di dinamica delle popolazioni:

L’isola dei conigli

Quanto velocemente si espanderebbe una popolazione di conigli sotto appropriate condizioni?

In particolare, partendo da una coppia di conigli in un’isola deserta, e data una certa regola di riproduzione, quante coppie si avrebbero nell’anno n?

Page 9: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl9

• Una coppia di conigli concepisce due coniglietti di sesso diverso ogni anno, i quali formeranno una nuova coppia

• La gestazione dura un anno

• I conigli cominciano a riprodursi soltanto al secondo anno dopo la loro nascita

• I conigli sono immortali (!)

Le regole di riproduzione

Page 10: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl10

L’albero dei conigli

La riproduzione dei conigli può essere descritta in un albero come segue:

Page 11: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl11

• All’inizio dell’anno n, ci sono tutte le coppie dell’anno precedente, e una nuova coppia di conigli per ogni coppia presente due anni prima

La regola di espansione

• Indicando con Fn il numero di coppie all’inizio dell’anno n, abbiamo la seguente relazione di ricorrenza:

1 se n=1,2Fn-1 + Fn-2 se n≥3Fn =

Page 12: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl12

Il problema

Come calcoliamo Fn ?

Primi numeri della sequenza di Fibonacci:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, F18=2584,…

Page 13: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl13

Digressione: la sezione aureaRapporto fra due grandezze disuguali a>b, in

cui a è medio proporzionale tra b e a+b

(a+b) : a = a : ba b

e ponendo a=bb

a

Page 14: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl14

Keplero [1571-1630] osservò che

da cui si può dimostrare che la soluzione in forma chiusa della sequenza di Fibonacci, nota come formula di Binet [1786-1856], è:

Un approccio numerico

n

n

n F

F 1

lim

Page 15: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl15

Algoritmo fibonacci1

Page 16: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl16

• Molto efficiente: una sola linea di codice mandata in esecuzione (sebbene stiamo trascurando la complessità dell’operazione in essa contenuta)!

• Ma siamo sicuri che sia corretto? Sulla RAM (modello astratto) con celle di memoria infinite sì, ma su un modello di calcolo reale, con quale accuratezza devo fissare e per ottenere un risultato corretto?

• Ad esempio, con 3 cifre decimali:

Correttezza ed efficienza

ˆ

n fibonacci1(n) arrotondamento Fn

3 1.99992 2 2

16 986.698 987 987

18 2583.1 2583 2584

Page 17: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl17

Algoritmo fibonacci2

algoritmo fibonacci2(intero n) intero if (n ≤ 2) then return 1 else return fibonacci2(n-1) + fibonacci2(n-2)

Poiché fibonacci1 non è corretto, un approccio alternativo consiste nell’utilizzare direttamente la definizione ricorsiva:

Page 18: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl18

• Per valutare il tempo di esecuzione, calcoliamo il numero di linee di codice T(n) mandate in esecuzione

• Se n≤2: una sola linea di codice• Se n=3: quattro linee di codice, due per la

chiamata fibonacci2(3), una per la chiamata fibonacci2(2) e una per la chiamata fibonacci2(1), cioè

T(3)=2+T(2)+T(1)=2+1+1=4

Correttezza? Corretto per definizione!

Efficienza?

Page 19: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl19

Relazione di ricorrenza

Per n ≥3, in ogni chiamata si eseguono due linee di codice, oltre a quelle eseguite nelle chiamate ricorsive

T(n) = 2 + T(n-1) + T(n-2) n ≥ 3

In generale, il tempo di esecuzione di un algoritmo ricorsivo è pari al tempo speso all’interno della chiamata più il tempo speso nelle chiamate ricorsive

Page 20: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl20

Albero della ricorsione di fibonacci2

• Utile per risolvere la relazione di ricorrenza T(n)• Ogni nodo corrisponde ad una chiamata ricorsiva• I figli di un nodo corrispondono alle sottochiamate

Page 21: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl21

Alberi: qualche definizione

d=2 albero binario

albero d-ario: albero in cui tutti i nodi interni hanno (al più) d figli

Un albero è strettamente binario se tutti nodi interni hanno esattamente 2 figli

Page 22: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl22

• Etichettando i nodi dell’albero con il numero di linee di codice eseguite nella chiamata corrispondente:– I nodi interni hanno etichetta 2– Le foglie hanno etichetta 1

Calcolare T(n)

• Per calcolare T(n):– Contiamo il numero di foglie– Contiamo il numero di nodi interni

Page 23: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl23

Calcolare T(n)

In totale le linee di codice eseguite sono

T(n) = Fn + 2 (Fn-1) = 3Fn-2

Lemma 1:Il numero di foglie dell’albero della ricorsione di fibonacci2(n) è pari a Fn

dim (da fare a casa, per induzione su n)

Lemma 2:Il numero di nodi interni di un albero strettamente binario (come l’albero della ricorsione di fibonacci2(n)) è pari al numero di foglie -1dim (da fare a casa, per induzione sul numero di nodi interni dell’albero)

Page 24: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl24

fibonacci2 è un algoritmo lento, perché esegue un numero di linee di codice esponenziale in n:

T(n) ≈ Fn ≈ n

Osservazioni

n = 8

Alcuni esempi di linee di codice eseguite

T(n)=3 · F8 – 2= 3 · 21 – 2 = 61n = 45 T(n) =3·F45 – 2 = 3·1.134.903.170 – 2 = 3.404.709.508

n = 100… con le attuali tecnologie, calcolare F100 richiederebbe circa 8000 anni!

Possiamo fare di meglio?

Page 25: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl25

• Perché l’algoritmo fibonacci2 è lento? Perché continua a ricalcolare ripetutamente la soluzione dello stesso sottoproblema. Perché non memorizzare allora in un array le soluzioni dei sottoproblemi?

Algoritmo fibonacci3

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]

Correttezza? Corretto per definizione!

Page 26: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl26

• Il vettore o array è una struttura dati utilizzata per rappresentare sequenze di elementi omogenei

• Un vettore è visualizzabile tramite una struttura unidimensionale di celle; ad esempio, un vettore di 5 interi ha la seguente forma

• Ciascuna delle celle dell'array è identificata da un valore di indice

• Gli array sono (generalmente) allocati in celle contigue della memoria del computer

La struttura dati vettore o array

5 23 1 12 5

Page 27: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl27

• Linee 1, 2, e 5 eseguite una sola volta• Linea 3 eseguita n – 1 volte (una sola volta per n=1,2)• Linea 4 eseguita n – 2 volte (non eseguita per n=1,2)• T(n): numero di linee di codice mandate in

esecuzione da fibonacci3

Calcolo del tempo di esecuzione

T(n) = n – 1 + n – 2 + 3 = 2n n > 1

T(1) = 4

T(45) = 90Per n=45, circa 38 milioni di volte più veloce

dell’algoritmo fibonacci2!

T(100) = 200

Page 28: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl28

• L’algoritmo fibonacci3 impiega tempo proporzionale a n invece che esponenziale in n, come accadeva invece per fibonacci2

• Tempo effettivo richiesto da implementazioni in C dei due algoritmi su piattaforme diverse (un po’ obsolete ):

Calcolo del tempo di esecuzione

Page 29: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl

• 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, 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 da quanto attendiamo!

• È il caso di Fibonacci3, la cui correttezza è subordinata alla dimensione della memoria allocabile

Occupazione di memoria

Page 30: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl

• fibonacci3 usa un array di dimensione n prefissata• 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

algoritmo fibonacci4(intero n) intero a b 1 for i = 3 to n do c a+b a b b c return b

Page 31: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl

• Per la risorsa tempo, calcoliamo il numero di linee di codice T(n) mandate in esecuzione – Se n≤2: tre sole linee di codice– Se n3: T(n) = 2+(n-1)+3·(n-2) = 4n-5 (per Fibonacci3 avevamo T(n)=2n)

• Per la risorsa spazio, contiamo il numero di variabili di lavoro utilizzate: S(n)=4 (per Fibonacci3 avevamo S(n)=n+1) [NOTA: stiamo assumendo che ogni locazione di memoria può contenere un valore infinitamente grande!]

Correttezza? Corretto per definizione!

Efficienza?

Page 32: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl

• Misurare T(n) come il numero di linee di codice mandate in esecuzione è una misura molto approssimativa del tempo di esecuzione

• Se andiamo a capo più spesso, aumenteranno le linee di codice sorgente, ma certo non il tempo richiesto dall’esecuzione del programma!

Notazione asintotica

Page 33: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl

• Per lo stesso programma impaginato diversamente potremmo concludere ad esempio che T(n)=3n oppure T(n)=5n

• Vorremmo un modo per descrivere l’ordine di grandezza di T(n) ignorando dettagli "inessenziali" come le costanti moltiplicative, additive e sottrattive

• Useremo a questo scopo la notazione asintotica Θ, simile alla notazione O che abbiamo già visto

Notazione asintotica

Page 34: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl

Supponiamo che f e g siano due funzioni definitivamente diverse da zero per n∞, e che

Allora, scriveremo che f(n) = Q(g(n)).

Notazione asintotica Q (definizione informale)

LLng

nfn

0,)(

)(lim

Page 35: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl

Esempi:

Sia f(n) = 2n2 + 3n, allora f(n)=Θ(n2)

Sia f(n) = n2 – n log n, allora f(n)=Θ(n2)

Sia f(n) = n3 -2n2+3n, allora f(n)=Θ(n3)

Sia f(n) = 23, allora f(n)=Θ(1)

Sia f(n) = 3n +2n, allora f(n)=Θ(3n)

Page 36: Didattica e Fondamenti degli Algoritmi e della Calcolabilità Quarta giornata Risolvere efficientemente un problema in P: la sequenza di Fibonacci Guido.

Copyright © 2004 - The McGraw - Hill Companies, srl

• Fibonacci2 T(n)=3Fn-2 T(n)=Θ(Fn) T(n)=Θ(n), poiché

• Fibonacci3 T(n)=2n T(n)=Θ(n), S(n)=Θ(n)• Fibonacci4 T(n)=4n-5 T(n)=Θ(n), S(n)=Θ(1)

Andamento asintotico per i Fibonacci

5

151

lim

n

nn

n