• Non ci sono risultati.

Algoritmica Note su Complessità

N/A
N/A
Protected

Academic year: 2021

Condividi "Algoritmica Note su Complessità"

Copied!
72
0
0

Testo completo

(1)

Algoritmica

Note su Complessità

G. Prencipe

giuseppe.prencipe@unipi.it

(2)

Tempo di esecuzione

• Il tempo di esecuzione di un programma dipende da:

- Hardware - Compilatore - Input

- Soluzione - ….

Computer potente o

Soluzione efficiente?

(3)

Partiamo da un esempio

Tempo di Esecuzione

Ordine del Tempo di Esecuzione

Problema P

Algoritmo

L

Algoritmo

Q

Algoritmo

C

N

3

N

2

N

N

3

N

2

N

Solita assunzione che ogni passo costa 1 (modello RAM)

(4)

Partiamo da un esempio

• Immaginiamo di avere una

scadenza per la soluzione di P

Entro il tempo T, la soluzione scelta deve terminare

T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N

(5)

Partiamo da un esempio

• Immaginiamo di avere una

scadenza per la soluzione di P

Entro il tempo T, la soluzione scelta deve terminare

T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N

Quanti elementi ognuna delle tre soluzioni è in grado di

processare nel tempo T?

(6)

Partiamo da un esempio

• ????

Quanti elementi ognuna delle tre soluzioni è in grado di

processare nel tempo T?

T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N

(7)

Partiamo da un esempio

• N

3

= T N = ∛T

• N

2

= T N = √T

• N = T N = T

Quanti elementi ognuna delle tre soluzioni è in grado di

processare nel tempo T?

T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N

(8)

Partiamo da un esempio

• N

3

= T N

C

= ∛T

• N

2

= T N

Q

= √T

• N = T N

L

= T

Quanti elementi ognuna delle tre soluzioni è in grado di

processare nel tempo T?

T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N

(9)

Partiamo da un esempio

• N

3

= T N

C

= ∛T

• N

2

= T N

Q

= √T

• N = T N

L

= T

Quanti elementi ognuna delle tre soluzioni è in grado di

processare nel tempo T?

T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N

Aggiungiamo pedici per

distinguere le tre “N”

(10)

Partiamo da un esempio

Cosa possiamo dedurre?

….al crescere di T….

Quanti elementi ognuna delle tre soluzioni è in grado di

processare nel tempo T?

T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N

N

C

= ∛T N

Q

= √T N

L

= T

(11)

Partiamo da un esempio

Cosa possiamo dedurre?

….al crescere di T, le tre soluzioni

permettono di elaborare più dati, ma con una diversa velocità polinomiale

Quanti elementi ognuna delle tre soluzioni è in grado di

processare nel tempo T?

T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N

N

C

= ∛T N

Q

= √T N

L

= T

(12)

Partiamo da un esempio

….al crescere di T, le tre soluzioni

permettono di elaborare più dati, ma con una diversa velocità polinomiale

T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N N

C

= ∛T N

Q

= √T N

L

= T

1 ora 10 ore 100 ore N3

N2

N ???? ???? ????

1 operazione atomica impiega 1s

(13)

Partiamo da un esempio

….al crescere di T, le tre soluzioni

permettono di elaborare più dati, ma con una diversa velocità polinomiale

T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N N

C

= ∛T N

Q

= √T N

L

= T

1 ora 10 ore 100 ore

N3 15,32 33,01 71,13

N2 60 189,73 600

N 3600 36000 360000

1 operazione atomica impiega 1s

(14)

Partiamo da un esempio

Supponiamo ora di acquistare un calcolatore k volte più potente….(ad esempio k=10)

T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N N

C

= ∛T N

Q

= √T N

L

= T

1 ora 10 ore 100 ore

N3 33,01 71,13 153,26

N2 189,73 600 1897,36

N 36000 360000 3600000

1 operazione atomica impiega 0.1s

(15)

Partiamo da un esempio

Supponiamo ora di acquistare un calcolatore k volte più potente….

• Questo è equivalente a usare k volte di più il vecchio calcolatore

T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N

N

C

= ∛kT N

Q

= √kT N

L

= kT

(16)

Partiamo da un esempio

Supponiamo ora di acquistare un calcolatore k volte più potente….

• Questo è equivalente a usare k volte di più il vecchio calcolatore

T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N

N

C

= ∛kT N

Q

= √kT N

L

= kT

N

C

= ∛k ∛T N

Q

= √k √T N

L

= kT

(17)

Partiamo da un esempio T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N N

C

= ∛k ∛T N

Q

= √k √T N

L

= kT

Il vantaggio ottenuto impiegando il calcolatore più veloce è tanto

maggiore quanto migliore è

l’algoritmo impiegato!!!!

(18)

E quindi?

Prestazioni (ad es., #transistori per chip) dei calcolatori

raddoppiano ogni 18 mesi

Legge di Moore (co-fondatore di Intel, 1965)

(19)

E quindi?

• Quindi, conviene concentrarsi da subito sulla progettazione di algoritmi efficienti per P piuttosto che attendere calcolatori più potenti!!!!

Prestazioni (ad es., #transistori per chip) dei calcolatori

raddoppiano ogni 18 mesi

Legge di Moore (co-fondatore di Intel, 1965)

(20)

Ultima considerazione T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N N

C

= ∛k ∛T N

Q

= √k √T N

L

= kT

• Quanto più potente deve essere il nuovo

calcolatore per poter eseguire T

C

nello

stesso tempo impiegato dal vecchio per

eseguire T

L

?

(21)

Ultima considerazione T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N N

C

= ∛k ∛T N

Q

= √k √T N

L

= kT

• Quanto più potente deve essere il nuovo calcolatore per poter eseguire T

C

nello stesso tempo impiegato dal vecchio per eseguire T

L

?

• ∛kT = T

(22)

Ultima considerazione T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N N

C

= ∛k ∛T N

Q

= √k √T N

L

= kT

• Quanto più potente deve essere il nuovo calcolatore per poter eseguire T

C

nello stesso tempo impiegato dal vecchio per eseguire T

L

?

• ∛kT = T ∛k = T / ∛T

(23)

Ultima considerazione T

C

(N) = N

3

T

Q

(N) = N

2

T

L

(N) = N N

C

= ∛k ∛T N

Q

= √k √T N

L

= kT

• Quanto più potente deve essere il nuovo calcolatore per poter eseguire T

C

nello stesso tempo impiegato dal vecchio per eseguire T

L

?

• ∛kT = T ∛k = T / ∛T k = T

2

(24)

Ultima considerazione k = T

2

1 op al secondo , T=N=3600 ⇒ k=3600

2

= 12960000

volte più veloce!

(25)

Ultima considerazione k = T

2

1 op al secondo , T=N=3600 ⇒ k=3600

2

= 12960000 volte più veloce!

Cioè, il nuovo calcolatore deve effettuare 1 op ogni

~10

-6

secondi, che, secondo Moore sono ~34anni!!!!

(26)

Ultima considerazione k = T

2

1 op al secondo , T=N=3600 ⇒ k=3600

2

= 12960000 volte più veloce!

Cioè, il nuovo calcolatore deve effettuare 1 op ogni

~10

-6

secondi, che, secondo Moore sono ~34anni!!!!

(27)

Ultima considerazione k = T

2

1 op al secondo , T=N=3600 ⇒ k=3600

2

= 12960000 volte più veloce!

Cioè, il nuovo calcolatore deve effettuare 1 op ogni

~10

-6

secondi, che, secondo Moore sono ~34anni!!!!

….e senza considerare che

la legge di Moore non può

crescere all’infinito!!!!

(28)

Algoritmica

Ricorsione

G. Prencipe

giuseppe.prencipe@unipi.it

(29)

Esempio: Hanoi

Lo scopo del gioco è di spostare la pila di dischi su un altro piolo, rispettando le seguenti regole:

Si può muovere solo un disco alla volta.

Una mossa consiste nel prendere un disco da una pila e piazzarlo su un’altra pila.

Un disco non può essere piazzato su un disco più piccolo.

(30)

An example: Hanoi

Il gioco fu inventato dal matematico francese Édouard Lucas nel 1883.

La leggenda narra che in un tempio Indiano a Kashi Vishwanath c’è una grande stanza con tre colonne di diamante, e 64 dischi dorati. I sacerdoti brahmani, seguendo le direttive di un’antica profezia,

spostano da allora questi dischi in accordo con le immutabili regole di Brahma. Il gioco è infatti anche noto come Il gioco della torre

of Brahma. Secondo la leggenda, quando l’ultima mossa sarà effettuata, il mondo finirà.

(31)

An example: Hanoi

Per N=1, facile!

A B C

(32)

An example: Hanoi

Per N=1, facile!

Sposta l’unico disco da A a C!

A B C

(33)

An example: Hanoi

Conoscendo la soluzione per N=1, possiamo risolvere per N = 2?

A B C

(34)

An example: Hanoi

Conoscendo la soluzione per N=1, possiamo risolvere per N = 2?

Usa B come piolo di supporto

A B C

(35)

An example: Hanoi

Conoscendo la soluzione per N=1, possiamo risolvere per N = 2?

Usa B come piolo di supporto

A B C

(36)

An example: Hanoi

Conoscendo la soluzione per N=1, possiamo risolvere per N = 2?

Usa B come piolo di supporto

A B C

(37)

An example: Hanoi

Conoscendo la soluzione per N=1, possiamo risolvere per N = 2?

Usa B come piolo di supporto

A B C

(38)

An example: Hanoi

Come generalizzare per N > 2?

Suggerimento: argomento ricorsivo!

(39)

An example: Hanoi

Come generalizzare per N > 2?

Se sapessimo risolvere per N, possiamo risolvere per N+1?

A B C

N

(40)

An example: Hanoi

Come generalizzare per N > 2?

Se sapessimo risolvere per N, possiamo risolvere per N+1?

A B C

(41)

An example: Hanoi

Come generalizzare per N > 2?

Se sapessimo risolvere per N, possiamo risolvere per N+1?

A B C

(42)

An example: Hanoi

Come generalizzare per N > 2?

Se sapessimo risolvere per N, possiamo risolvere per N+1?

A B C

(43)

An example: Hanoi

hanoi(n, A, B, C):

if (n ==1)

sposta da A a C;

else{

????

sposta da A a C;

????

}

sposta n dischi da A a C, usando B

(44)

An example: Hanoi

hanoi(n, A, B, C):

if (n ==1)

sposta da A a C;

else{

hanoi(n-1, A, C, B);

sposta da A a C;

hanoi(n-1, B, A, C);

}

sposta n dischi da A a C, usando B

(45)

An example: Hanoi

se N == 1 —> 1 mossa

se N > 1 —> ????

hanoi(n, A, B, C):

if (n ==1)

sposta da A a C;

else{

hanoi(n-1, A, C, B);

sposta da A a C;

hanoi(n-1, B, A, C);

}

relazione di ricorrenza….

(46)

An example: Hanoi

se N == 1 —> 1 mossa

se N > 1 —> 2h(N-1) + 1 hanoi(n, A, B, C):

if (n ==1)

sposta da A a C;

else{

hanoi(n-1, A, C, B);

sposta da A a C;

hanoi(n-1, B, A, C);

}

(47)

An example: Hanoi

h(1) = 1

h(N) = 2h(N-1) + 1, N > 1

(48)

An example: Hanoi

h(1) = 1

h(N) = 2h(N-1) + 1, N > 1

Provate a risolvere per

sostituzione

(49)

An example: Hanoi

h(1) = 1

h(N) = 2h(N-1) + 1, N > 1

h(N) = 2h(N-1) + 1 = 2(2h(N-2) + 1) + 1

(50)

An example: Hanoi

h(1) = 1

h(N) = 2h(N-1) + 1, N > 1

h(N) = 2h(N-1) + 1 = 2(2h(N-2) + 1) + 1

= 4h(N-2) + 3 = 4(2h(N-3) + 1 ) + 3

(51)

An example: Hanoi

h(1) = 1

h(N) = 2h(N-1) + 1, N > 1

h(N) = 2h(N-1) + 1 = 2(2h(N-2) + 1) + 1

= 4h(N-2) + 3 = 4(2h(N-3) + 1 ) + 3

= 8h(N-3) + 7 = ….

(52)

An example: Hanoi

h(1) = 1

h(N) = 2h(N-1) + 1, N > 1

h(N) = 2h(N-1) + 1 = 2(2h(N-2) + 1) + 1

= 4h(N-2) + 3 = 4(2h(N-3) + 1 ) + 3

= 8h(N-3) + 7 = ….

= 2N-1h(1) + 2N-1 - 1

(53)

An example: Hanoi

h(1) = 1

h(N) = 2h(N-1) + 1, N > 1

h(N) = 2h(N-1) + 1 = 2(2h(N-2) + 1) + 1

= 4h(N-2) + 3 = 4(2h(N-3) + 1 ) + 3

= 8h(N-3) + 7 = ….

= 2N-1h(1) + 2N-1 - 1

= 2N - 1

(54)

An example: Hanoi

h(1) = 1

h(N) = 2h(N-1) + 1, N > 1

h(N) = 2h(N-1) + 1 = 2(2h(N-2) + 1) + 1

= 4h(N-2) + 3 = 4(2h(N-3) + 1 ) + 3

= 8h(N-3) + 7 = ….

= 2N-1h(1) + 2N-1 - 1

= 2N - 1 Esponenziale!

580 miliardi di anni per 64 disks!

(55)

Esercizio

Cosa fa la procedura seguente? Qual è la sua complessità?

CosaFa(a, sx, dx) {

if (sx == dx) return a[sx];

cx = (sx + dx)/2;

m1 = CosaFa(a, sx, cx);

m2 = CosaFa(a, cx+1, dx);

return m1 + m2;

}

TCF(1) = ????

TCF(N) = ????

(56)

Esercizio

Cosa fa la procedura seguente? Qual è la sua complessità?

CosaFa(a, sx, dx) {

if (sx == dx) return a[sx];

cx = (sx + dx)/2;

m1 = CosaFa(a, sx, cx);

m2 = CosaFa(a, cx+1, dx);

return m1 + m2;

}

TCF(1) = 1 TCF(N) = ????

(57)

Esercizio

Cosa fa la procedura seguente? Qual è la sua complessità?

CosaFa(a, sx, dx) {

if (sx == dx) return a[sx];

cx = (sx + dx)/2;

m1 = CosaFa(a, sx, cx);

m2 = CosaFa(a, cx+1, dx);

return m1 + m2;

}

TCF(1) = 1

TCF(N) = 2TCF(N/2) + 1

(58)

Esercizio

Cosa fa la procedura seguente? Qual è la sua complessità?

CosaFa(a, sx, dx) {

if (sx == dx) return a[sx];

cx = (sx + dx)/2;

m1 = CosaFa(a, sx, cx);

m2 = CosaFa(a, cx+1, dx);

return m1 + m2;

}

TCF(1) = 1

TCF(N) = 2TCF(N/2) + 1

TCF(N) = 2TCF(N/2) + 1 = 2(2TCF(N/4) + 1) + 1

(59)

Esercizio

Cosa fa la procedura seguente? Qual è la sua complessità?

CosaFa(a, sx, dx) {

if (sx == dx) return a[sx];

cx = (sx + dx)/2;

m1 = CosaFa(a, sx, cx);

m2 = CosaFa(a, cx+1, dx);

return m1 + m2;

}

TCF(N) = 2TCF(N/2) + 1 = 2(2TCF(N/4) + 1) + 1

= 4TCF(N/4) + 3 = 2(4TCF(N/8) + 3) + 1

TCF(1) = 1

TCF(N) = 2TCF(N/2) + 1

(60)

Esercizio

Cosa fa la procedura seguente? Qual è la sua complessità?

CosaFa(a, sx, dx) {

if (sx == dx) return a[sx];

cx = (sx + dx)/2;

m1 = CosaFa(a, sx, cx);

m2 = CosaFa(a, cx+1, dx);

return m1 + m2;

}

TCF(N) = 2TCF(N/2) + 1 = 2(2TCF(N/4) + 1) + 1

= 8TCF(N/8) + 7 = ….

= 4TCF(N/4) + 3 = 2(4TCF(N/8) + 3) + 1

TCF(1) = 1

TCF(N) = 2TCF(N/2) + 1

(61)

Esercizio

Cosa fa la procedura seguente? Qual è la sua complessità?

CosaFa(a, sx, dx) {

if (sx == dx) return a[sx];

cx = (sx + dx)/2;

m1 = CosaFa(a, sx, cx);

m2 = CosaFa(a, cx+1, dx);

return m1 + m2;

}

TCF(N) = 2TCF(N/2) + 1 = 2(2TCF(N/4) + 1) + 1

= 2kTCF(N/2k) + 2k - 1 = [2k == N ⇔ k == log2N] =

= 8TCF(N/8) + 7 = ….

= 4TCF(N/4) + 3 = 2(4TCF(N/8) + 3) + 1

TCF(1) = 1

TCF(N) = 2TCF(N/2) + 1

(62)

Esercizio

Cosa fa la procedura seguente? Qual è la sua complessità?

CosaFa(a, sx, dx) {

if (sx == dx) return a[sx];

cx = (sx + dx)/2;

m1 = CosaFa(a, sx, cx);

m2 = CosaFa(a, cx+1, dx);

return m1 + m2;

}

= 8TCF(N/8) + 7 = ….

= 2kTCF(N/2k) + 2k - 1 = [2k == N ⇔ k == log2N] =

= NTCF(1) + N - 1 = 2N - 1

= 4TCF(N/4) + 3 = 2(4TCF(N/8) + 3) + 1 TCF(N) = 2TCF(N/2) + 1 = 2(2TCF(N/4) + 1) + 1

TCF(1) = 1

TCF(N) = 2TCF(N/2) + 1

(63)

Esercizio 2

T(N) = T(N/2) + 1 = T(1) = 1

T(N) = T(N/2) + 1

Provate a risolvere per

sostituzione

(64)

Esercizio 2

T(N) = T(N/2) + 1 = T(N/4) + 1 + 1 T(1) = 1

T(N) = T(N/2) + 1

Provate a risolvere per

sostituzione

(65)

Esercizio 2

= T(N/4) + 2 =

T(N) = T(N/2) + 1 = T(N/4) + 1 + 1 T(1) = 1

T(N) = T(N/2) + 1

Provate a risolvere per

sostituzione

(66)

Esercizio 2

= T(N/8) + 3 = ….

= T(N/4) + 2 =

T(N) = T(N/2) + 1 = T(N/4) + 1 + 1 T(1) = 1

T(N) = T(N/2) + 1

Provate a risolvere per

sostituzione

(67)

Esercizio 2

= T(N/8) + 3 = ….

= T(N/2k) + k = [2k == N ⇔ k == log2N] =

= T(N/4) + 2 =

T(N) = T(N/2) + 1 = T(N/4) + 1 + 1 T(1) = 1

T(N) = T(N/2) + 1

Provate a risolvere per

sostituzione

(68)

Esercizio 2

= T(N/8) + 3 = ….

= T(N/2k) + k = [2k == N ⇔ k == log2N] =

= T(1) + log2N

= T(N/4) + 2 =

T(N) = T(N/2) + 1 = T(N/4) + 1 + 1 T(1) = 1

T(N) = T(N/2) + 1

Provate a risolvere per

sostituzione

(69)

Esercizio 2

= T(N/8) + 3 = ….

= T(N/2k) + k = [2k == N ⇔ k == log2N] =

= T(1) + log2N

= T(N/4) + 2 =

T(N) = T(N/2) + 1 = T(N/4) + 1 + 1 T(1) = 1

T(N) = T(N/2) + 1

Provate a risolvere per sostituzione

Algoritmo con questa

complessità?

(70)

Esercizio 3

= T(1) + log2N T(1) = 1

T(N) = T(N/2) + 1

Algoritmo con questa

complessità?

(71)

Esercizio 3

= T(1) + log2N T(1) = 1

T(N) = T(N/2) + 1

Algoritmo con questa complessità?

AlgoLog(a, sx, dx) {

if (sx == dx) return a[sx];

cx = (sx + dx)/2;

m1 = AlgoLog(a, sx, cx);

return m1;

}

(72)

Esercizio 3

= T(1) + log2N T(1) = 1

T(N) = T(N/2) + 1

Algoritmo con questa complessità?

AlgoLog(a, sx, dx) {

if (sx == dx) return a[sx];

cx = (sx + dx)/2;

m1 = AlgoLog(a, sx, cx);

return m1;

}

Cosa fa????

Riferimenti

Documenti correlati

Dai dati riportati in tabella 3, sono state formulate alcune considerazioni: la curtosi fornisce un’informazione sull’allontanamento dalla normalità distributiva, quindi, per

Questa soluzione non ha condizioni di equilibrio e, per qualunque valore dei parametri iniziali, la massa m accelera verso “infinito”, dove ovviamente il termine “infinito” indica

Un estremo della molla ` e fissato sull’asse, mentre all’altro estremo ` e fissata una massa m che pu` o scorrere all’interno della scanalatura senza attrito. Dire in quali

Per prima cosa abbiamo cercato di minimizzare la costante di Lebesgue utilizzando come incognite i punti di interpolazione.. Abbiamo usato come algoritmi GA

• Con lo scheduling SCAN le richieste vengono evase secondo l’ordine con cui vengono incontrate dalla testina, che si sposta nella stessa direzione da una estremità all’altra

sul disco è praticata un scanalatura diametrale, in cui può scorrere senza attrito una pallina di massa m, legata al centro mediante una molla di lunghezza a riposo nulla e

Un disco di massa M e raggio R è libero di ruotare attorno ad un asse verticale orto- gonale ad esso e passante per il suo centro.. Sul suo bordo si trova una macchinina di

| Rispetto ad un disco, un nastro è meno costoso e contiene più dati, ma l’accesso casuale è molto più lento. | Il nastro è un mezzo economico per usi che non richiedono un