Transcript
Page 1: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Chiara Bodei, Jacopo SoldaniDipartimento di InformaticaUniversitร  of Pisa

A1. Introduzione agli AlgoritmiFondamenti di Programmazione e Laboratorio

Page 2: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Algoritmi: Definizione Informale

2

Es. algoritmo CuociLaPasta

1. Riempi la pentola dโ€™acqua

2. Metti la pentola sul fornello

3. Accendi il fornello

4. Attendi che lโ€™acqua sia arrivata ad ebollizione

5. Aggiungi il sale

6. Butta la pasta

7. Attendi il tempo di cottura della pasta

8. Scola la pasta

9. Spegni il fornello

Un algoritmo รจ un insieme di istruzioni, definite passo per passo, che possono essere riprodotte meccanicamente

per determinare il risultato desiderato

Page 3: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Algoritmi: Perchรฉ? Come?

3

Gli algoritmi costituiscono una delle basi della programmazione

โ†’ Forniscono il procedimento per giungere alla soluzione di un dato problema di calcolo

Gli algoritmi saranno descritti ad alto livello, utilizzando il cosiddetto pseudocodice

โ€ข Lo pseudocodice ricorda linguaggi di programmazione reali (come il C), ma

โ€ข puรฒ contenere anche frasi in linguaggio naturale.

NB: La traduzione in un particolare linguaggio di programmazione (come C) puรฒ essere fatta in modo quasi meccanico.. provateci! :)

Page 4: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Correttezza ed Efficienza degli Algoritmi

4

Un algoritmo deve essere (i) corretto ed (ii-iii) efficiente, ovvero deve

i. produrre correttamente il risultato desiderato,

ii. essere "veloce" (efficiente in termini di tempo di esecuzione), e

iii. essere "economico" (efficiente in termini di occupazione di memoria)

(ii) e (iii) determinano la complessitร  in tempo e spazio dellโ€™algoritmo

Page 5: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Come Analizzare gli Algoritmi, e Perchรฉ Farlo

5

Come analizzare correttezza e complessitร  degli algoritmi?

โ€ข Analisi teorica (tramite dimostrazioni di correttezza e complessitร )

โ€ข Analisi sperimentale (tramite lโ€™analisi di possibili istanze di dati su cui lโ€™algoritmo opera)

Analisi teorica (vs. analisi sperimentale)

โ€ข piรน affidabile, poichรฉ vale su tutte le possibili istanze di dati su cui lโ€™algoritmo puรฒ operare

โ€ข semplifica il confronto tra diverse soluzioni algoritmiche per uno stesso problema

โ€ข consente la predizione delle prestazioni di un programma software che implementi effettivamente un algoritmo

Page 6: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Fibonacci: Un Problema Notoโ€ฆ..e Sei Diversi Algoritmi per Risolverlo

6

Page 7: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

I Conigli di Fibonacci

7

Domanda: Quante coppie di conigli si avrebbero allโ€™anno ๐’, partendo da una singola coppia di conigli?

Condizioni (aka. assunzioni):

โ€ข Ogni coppia di conigli fertili genera due nuovi coniglietti ogni anno

โ€ข I conigli risultano fertili solamente dal secondo anno dopo la loro nascita

โ€ข I conigli sono immortali

Problema: Quanto velocemente si espanderebbe una popolazione di conigli in unโ€™isola deserta e sotto appropriate condizioni?

Page 8: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

I Conigli di Fibonacci: Tasso di Riproduzione

8

Sotto tali condizioni, e partendo da una singola coppia di coniglietti, si ottiene quanto segue

โ€ข ๐น1 = 1 // una sola coppia di conigli

โ€ข ๐น2 = 1 // troppo giovani per riprodursi

โ€ข ๐น3 = 2 // una coppia si riproduce

โ€ข ๐น4 = 3 // una coppia si riproduce, mentre lโ€™altra รจ troppo giovane

โ€ข ๐น5 = 5 // due coppie si riproducono, una รจ troppo giovane

โ€ข โ€ฆ

dove

๐น๐‘› : numero di coppie di conigli presenti nellโ€™anno ๐’

Domanda: Qual รจ la regola di espansione della popolazione?

Page 9: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

La Regola di Espansione dei Conigli di Fibonacci

9

Nellโ€™anno ๐‘› ci sono le seguenti coppie di conigli:

โ€ข tutte le coppie dellโ€™anno precedente e

โ€ข una nuova coppia di coniglietti per ogni coppia fertile (ovvero giร  presente due anni prima)

Continuando ad indicare con ๐น๐‘› il numero di coppie di conigli presenti nellโ€™anno ๐‘›, abbiamo quindi la seguente relazione di ricorrenza:

๐น๐‘› = แ‰Š๐น๐‘›โˆ’1 + ๐น๐‘›โˆ’2 ๐‘› โ‰ฅ 31 ๐‘› = 1,2

Problema: Come calcoliamo ๐น๐‘›?

Page 10: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Approccio Numerico: Fib1

10

Lโ€™ennesimo numero della sequenza di Fibonacci si puรฒ calcolare in funzione della sezione aurea ๐“, grazie alla formula di Binet

๐น๐‘› =๐œ™๐‘› โˆ’ โˆ’๐œ™ โˆ’๐‘›

5

Problema: ๐œ™ รจ un numero irrazionale, non rappresentabile nella memoria di un calcolatore

Soluzione: Approssimare la sezione aurea ๐œ™ con un valore rappresentabile, es 1.618

๐น๐‘› =1,618๐‘› โˆ’ โˆ’1,618 โˆ’๐‘›

5

Page 11: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Lโ€™algoritmo Fib1

11

int Fib1(int n) {

return1,618๐‘›โˆ’ โˆ’1,618 โˆ’๐‘›

5;

}

Domanda: Lโ€™algoritmo Fib1 รจ corretto?

Page 12: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Correttezza di Fib1

12

Lโ€™accuratezza di una soluzione come quella dellโ€™algoritmo Fib1 dipende strettamente da come/quanto sono approssimati i valori non rappresentabili (come ๐œ™, ad esempio)

Ad esempio, approssimando ๐œ™ con 3 cifre decimali (ovvero usando 1.618 al posto di ๐œ™) si ha che

โ€ฆ quindi (un approccio come quello in) Fib1 non puรฒ essere considerato corretto.

n 1,618๐‘›โˆ’ โˆ’1,618 โˆ’๐‘›

5Fib1(n) ๐น๐‘›

3 1.99992 2 2

16 986.698 987 987

18 2583.1 2583 2584

Domanda: E se usassimo direttamente la definizione ricorsiva di ๐น๐‘›?

Page 13: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Approccio Ricorsivo: Fib2

13

NB: Operando solamente con numeri interi, non presenta il problema dellโ€™approssimazione.

โ†’ Calcola correttamente lโ€™ennesimo numero della sequenza di Fibonacci!

int Fib2(int n) {

if n<=2 then return 1;

else return Fib2(n-1) + Fib2(n-2);

}

Domanda: Quanto tempo richiede Fib2?

Page 14: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Misurare la Complessitร  in Tempo

14

Come misurare il tempo impiegato da un algoritmo?

โ€ข In secondi?

(mmmโ€ฆdipende dalla piattaforma di esecuzioneโ€ฆ)

โ€ข In numero di istruzioni macchina?

(mmmโ€ฆdipende dal compilatoreโ€ฆ)

โ€ข Altre idee?

In prima approssimazione, consideriamo

โ€ข il numero di linee di pseudocodice mandate in esecuzione

(indipendente da piattaforma/compilatoreโ€ฆ)

Page 15: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Tempo di Esecuzione di Fib2

15

Numero di linee di codice mandate in esecuzione da Fib2:

โ€ข n=1 โ†’ 1 linea di codice

โ€ข n=2 โ†’ 1 linea di codice

โ€ข n=3 โ†’ 2 linee per Fib2(3), 1 per Fib2(2), e 1 per Fib2(1)

โ€ข n=4 โ†’ 2 linee per Fib2(4), 2 per Fib2(3), e 1 per Fib2(2)

โ€ข โ€ฆ

Osservazione: Quando n>=3

โ€ข si eseguono due linee di codice,

โ€ข oltre a quelle eseguite nelle chiamate ricorsive

Page 16: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Relazione di Ricorrenza

16

Per Fib2, quindi, si ha che๐‘‡(๐‘›) = 2 + ๐‘‡(๐‘› โˆ’ 1) + ๐‘‡(๐‘› โˆ’ 2)

In generale: il tempo richiesto da un algoritmo ricorsivo รจ pari al tempo speso allโ€™interno della chiamata

piรน quello speso nelle chiamate ricorsive

Domanda: Come calcolare ๐‘‡(๐‘›)?

Page 17: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Albero di Ricorsione

17

La ricorsione puรฒ essere visualizzata mediante il cosiddetto albero di ricorsione

โ€ข nodi โ‰ˆ attivazioni della funzione

โ€ข archi โ‰ˆ chiamate ricorsive

Ad esempio

Fib2(6)

Fib2(5) Fib2(4)

Fib2(3) Fib2(2)

Fib2(2) Fib2(1)

Fib2(4)

Fib2(3) Fib2(2)

Fib2(2) Fib2(1)

Fib2(3)

Fib2(2) Fib2(1)

Page 18: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Calcolare ๐‘‡ ๐‘›

18

Intuitivamente, il valore di ๐‘‡(๐‘›) puรฒ essere calcolato

โ€ข assegnando "pesi" i nodi dellโ€™albero con il numero di linee di codice eseguite nella chiamata corrispondente,

- i nodi interni "pesano" 2 istruzioni

- i nodi foglia "pesano" 1 istruzione

โ€ข contando i numeri di nodi interni e di foglie, e

โ€ข moltiplicandoli per il loro peso

Page 19: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Calcolare ๐‘‡ ๐‘› (2)

19

Osservazione 1: Il numero di foglie dellโ€™albero di ricorsione di Fib2(n) รจ pari a ๐น๐‘›

Osservazione 2: Il numero di nodiinterni in un albero in cui ogninodo ha 2 figli รจ pari alnumero di foglie โ€“ 1

In totale, le line di codice eseguite sono๐‘‡ ๐‘› = ๐น๐‘› + 2 โˆ™ (๐น๐‘› โˆ’1) = 3๐น๐‘› โˆ’ 2

Fib2(6)

Fib2(5) Fib2(4)

Fib2(3) Fib2(2)

Fib2(2) Fib2(1)

Fib2(4)

Fib2(3) Fib2(2)

Fib2(2) Fib2(1)

Fib2(3)

Fib2(2) Fib2(1)

Fib2(n) รจ lento, visto che ๐‘‡ ๐‘› โ‰ˆ ๐น๐‘›

Page 20: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Una Soluzione Piรน Veloce?

20

Lโ€™algoritmo Fib2 calcola ripetutamente la soluzione dello stesso sottoproblema

Ad esempio, per Fib2(5)

โ€ข calcola Fib2(4), risolvendo ricorsivamente

โ€ข Fib2(3) e

โ€ข Fib2(2), e poi

โ€ข ricalcola Fib2(3), risolvendo ricorsivamente

โ€ข Fib2(2) e

โ€ข Fib2(1)

Idea: E se ci salvassimo i risultati giร  calcolati?

Page 21: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Usare la Memoria: Fib3

21

NB: Sfrutta lโ€™array F di n interi per evitare di ricalcolare i valori di ๐น๐‘–โˆ’1 e ๐น๐‘–โˆ’2 per ogni ๐‘– โˆˆ [2, ๐‘›)

int Fib3(int n) {

int *F = malloc(n*sizeof(int)); // F รจ un array di n interi

F[0]=F[1]=1;

for (int i=2;i<n;i++)

F[i] = F[i-1] + F[i-2];

return F[n-1];

}

Domanda: Quanto tempo richiede Fib3? Quanta memoria?

Page 22: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Tempo di Esecuzione di Fib3

22

Lโ€™algoritmo Fib3 "scorre un array di n interi" per calcolare ๐น๐‘›โ€ข Il numero di istruzioni da eseguire cresce proporzionalmente con ๐‘› e

โ€ข non esponenzialmente come nel caso di Fib2

Hardware Fib2(58) Fib3(58)

Pentium IV1700 MHz

15820 secondi(circa 4 ore)

0,7 milionesimi di secondo

Pentium III450 MHz

43518 secondi(circa 12 ore)

2,4 milionesimi di secondo

PowerPC G4 500MHz

58321 secondi(circa 16 ore)

2,8 milionesimi di secondo

Page 23: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Occupazione di Memoria

23

Il tempo di esecuzione non รจ il solo "costo" (o meglio, la sola risorsa di calcolo) da considerare

โ†’ Lโ€™occupazione di memoria puรฒ essere altrettanto cruciale

algoritmo lento

algoritmo che occupa piรน memoria di quella disponibile

necessario attendere a lungo per avere la soluzione

desiderata

non calcola mai la soluzione, indipendentemente dal

tempo che ci mette

Page 24: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Risparmiare Memoria: Fib4

24

NB: Fib3 usa un array di n interi, quando basterebbe mantenere solamente gli ultimi due valori di ๐น๐‘›

int Fib4(int n) {

int f1,f2,fcurr;

f1=f2=1;

for (int i=2;i<n;i++) {

fcurr = f1 + f2;

f1 = f2;

f2 = fcurr;

}

return fcurr;

}

NB: Fib4 impiega sempre un numero di istruzioni proporzionale a n, ma richiedendo un numero costante di interi in memoria (invece che una funzione di n)

Page 25: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Come Misurare il Tempo (2)

25

No, รจ una misura molto approssimativa! Ad esempio, possiamo aumentare le linee di codiceโ€ข inserendo commenti oโ€ข andando a capo piรน spesso

senza perรฒ aumentare anche il tempo di esecuzione del programma

Per lo stesso programma, potremmo concludere che โ€ข ๐‘‡ ๐‘› = 15๐‘› + 3 // senza commenti/accapoโ€ข ๐‘‡ ๐‘› = 350๐‘› + 5 // con commenti/accapo

Necessaria una notazione che permetta di astrarre da dettagli inessenziali come costanti e costanti moltiplicative..

Domanda: Ha davvero senso misurare ๐‘‡(๐‘›) come il numero di linee di codice mandate in esecuzione?

Page 26: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Notazione Asintotica

26

๐‘‡ ๐‘› = ๐‘“ ๐‘› = ๐‘‚(๐‘” ๐‘› )

se ๐‘“(๐‘›) < ๐‘ โˆ™ ๐‘”(๐‘›) per

โ€ข una qualche costante ๐‘ e

โ€ข ๐‘› sufficientemente grande (ovvero piรน grande di un qualche valore ๐‘›0)

Page 27: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Notazione Asintotica

27

Alcuni esempi

โ€ข ๐‘‡(๐‘›) = ๐‘› + 2 diventa ๐‘‡(๐‘›) = ๐‘‚(๐‘›)

โ€ข ๐‘‡(๐‘›) = 137๐‘› + 25 diventa ๐‘‡(๐‘›) = ๐‘‚(๐‘›)

โ€ข ๐‘‡(๐‘›) = 2๐‘› + 14 diventa ๐‘‡(๐‘›) = ๐‘‚(2๐‘›)

โ€ข ๐‘‡(๐‘›) = 2๐‘› + ๐‘›3 + 3 diventa ๐‘‡(๐‘›) = ๐‘‚(2๐‘›)

Page 28: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Notazione Asintotica: Fib4

28

Fib4 impiega un numero proporzionale ad n di istruzioni per calcolare ๐น๐‘›

๐‘‡๐น๐‘–๐‘4 ๐‘› = ๐‘‚(๐‘›)

Domanda: Possiamo calcolare ๐น๐‘› in un tempo inferiore a ๐‘‚(๐‘›)?

Page 29: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Metodo delle Potenze: Fib5

29

รˆ possibile dimostrare per induzione la seguente proprietร  di matrici

1 11 0

๐‘›

=๐น๐‘›+1 ๐น๐‘›๐น๐‘› ๐น๐‘›โˆ’1

Sfruttando questa proprietร  si ottiene un nuovo algoritmo

int Fib5(int n) {

M = 1 11 0

;

for (int i=0;i<n-1;i++)

M = M * 1 11 0

;

return M[0][0];

}

Domanda: Il tempo di esecuzione รจ sempre ๐‘‚(๐‘›).E quindi? A cosa serve?

Page 30: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Calcolare le Potenze in Modo Furbo

30

Calcoliamo la potenza n-esima di un numero moltiplicando quel numero n volte per se stesso

67 = 6 โˆ— 6 โˆ— 6 โˆ— 6 โˆ— 6 โˆ— 6 โˆ— 6 = 279.936

Possiamo perรฒ procedere anche come segue:

67 = 63 โˆ— 63 โˆ— 6 = 62 โˆ— 6 โˆ— 62 โˆ— 6 โˆ— 6 = 279.936

Ovvero scomporre il calcolo di una potenza ๐‘ฅ๐‘ฆ in

โ€ข calcolo di ๐‘ฅ๐‘ฆ/2,

โ€ข moltiplicazione ๐‘ฅ๐‘ฆ/2 per se stesso e

โ€ข moltiplicazione del risultato per ๐‘ฅ (solo se ๐‘ฆ รจ dispari)

Page 31: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Fib6

31

int Fib6(int n) {

int M = 1 11 0

;

potenza(M,n-1);

return M[0][0];

}

void potenza(int Matrice[][2],int esponente) {

if (n>1) {

potenza(Matrice,esponente/2);

Matrice = Matrice * Matrice;

}

if (esponente%2 == 1)

Matrice = Matrice * 1 11 0

;

}

Page 32: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Tempo di Esecuzione di Fib6

32

Dipende strettamente dallโ€™esecuzione di potenza

โ€ข potenza richiede tempo costante per essere eseguita, piรน

โ€ข la chiamata ricorsiva a potenza con input esponente/2

Fib6 quindi rispetta la seguente relazione di ricorrenza

๐‘‡ ๐‘› = แ‰๐‘‚ 1 + ๐‘‡

๐‘›

2, ๐‘› > 1

๐‘‚(1), ๐‘› โ‰ค 1

Domanda: Come risolverla?

Page 33: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Metodo dellโ€™Iterazione

33

Iterando su ๐‘›, si ottiene

๐‘‡ ๐‘› โ‰ค ๐‘ + ๐‘‡๐‘›

2โ‰ค ๐‘ + ๐‘ + ๐‘‡

๐‘›

4โ‰ค ๐‘ + ๐‘ + ๐‘ + ๐‘‡

๐‘›

8= 3๐‘ + ๐‘‡

๐‘›

23

In generale

๐‘‡ ๐‘› โ‰ค ๐‘˜๐‘ + ๐‘‡๐‘›

2๐‘˜

Per ๐‘˜ = log2 ๐‘› si ottiene๐‘‡ ๐‘› โ‰ค ๐‘ โˆ™ log2 ๐‘› + ๐‘‡ 1 = ๐‘‚(log2 ๐‘›)

Fib6 quindi รจ esponenzialmente piรน veloce di Fib3

Page 34: A1. Introduzione agli Algoritmipages.di.unipi.it/bodei/CORSO_FP_20/FP/Lezioni/...ย ยท n 1,618 ๐‘›โˆ’ โˆ’๐‘› 5 Fib1 ... NB: Fib4impiega sempre un numero di istruzioni proporzionale

Riepilogo: Complessitร  e Confronto di Soluzioni Diverse

34

Algoritmo Complessitร  in Tempo Complessitร  in Memoria

Fib2 ๐‘‚(2๐‘›) ๐‘‚(๐‘›)

Fib3 ๐‘‚(๐‘›) ๐‘‚(๐‘›)

Fib4 ๐‘‚(๐‘›) ๐‘‚(1)

Fib5 ๐‘‚(๐‘›) ๐‘‚(1)

Fib6 ๐‘‚(log2 ๐‘›) ๐‘‚(log2 ๐‘›)


Top Related