Sei sulla pagina 1di 14

Fondamenti di Informatica II

9. Complessit computazionale
Corso di Laurea in Ingegneria Informatica
A.A. 2008-2009
2 Semestre Corso (A-M)
Prof. Giovanni Pascoschi
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 2
Scelta di un algoritmo
Dato un problema, esistono diversi algoritmi che permettono di risolverlo.
I fattori che possono influenzare la scelta dellalgoritmo migliore sono tanti:
Tempo di elaborazione
Quantit di memoria (risorse necessarie)
Ecc.
Uno dei piu importanti criteri di scelta la cosiddetta
Complessit Computazionale
La Complessit computazionale si puo misurare essenzialmente come il
tempo necessario all'esecuzione dell'algoritmo su un computer di archi-
tettura tradizionale (p.e. non multiprocessore)
Finalit della Complessit Computazionale: lobiettivo principale di
comprendere le prestazioni massime raggiungibili da un algoritmo
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 3
Costo computazionale
Come si puo valutare la complessit computazionale?
Problema: come valutare lefficienza di un algoritmo
Affinch ci sia possibile occorre uno strumento per valutare la quantit di
risorse (Tempo e Memoria) necessarie per lesecuzione di un algoritmo
Possibilit di confrontare due algoritmi che risolvono lo stesso problema,
ossia stabilire quale dei due sia pi efficiente
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 4
Esempio
Algoritmo : Ricerca di un elemento in un vettore ordinato
1. Algoritmo risolutivo Ricerca sequenziale
qual il costo computazionale?
qual la quantit di risorse necessaria per la sua esecuzione
2. Algoritmo risolutivo Ricerca binaria
qual il costo computazionale?
qual la quantit di risorse necessaria per la sua esecuzione
Conclusione : qual il migliore algoritmo risolutivo?
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 5
Valutazione dellefficienza
Efficienza in termini di tempo
1.Assegnare una certa configurazione di dati di input
2.Eseguire lalgoritmo
3.Misurare il tempo necessario per ottenere la risposta
Efficienza in termini di spazio
1.Assegnare una certa configurazione di dati di input
2.Eseguire lalgoritmo
3.Misurare le risorse (memoria) necessarie per ottenere la risposta
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 6
Fattori che influenzano il tempo di calcolo
1. Macchina usata
2. Configurazione dei dati di ingresso
3. Dimensione dei dati di ingresso
La valutazione basata esclusivamente sul tempo non fornisce una misura
astratta e indipendente il piu possibile dai fattori sopra esposti
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 7
Primo requisito della complessit computazionale (macchina)
1. Non deve dipendere da una particolare macchina, dal sistema operativo o
da un particolare compilatore
il tempo di esecuzione di ogni istruzione in un qualunque linguaggio (ad
esempio in linguaggio macchina), non uguale per tutti i calcolatori ma varia
in dipendenza ad esempio della frequenza di lavoro della CPU (clock),
dall'architettura del calcolatore o dal set di istruzioni di cui la macchina
dispone (ad esempio la decodifica di ogni singola istruzione prima della sua
esecuzione, pi rapida in una macchina che usa un set limitato di istruzioni,
ossia in una macchina RISC).
Il tipo di sistema operativo puo influenzare il tempo di esecuzione (p.e. S.O.
multitasking)
Il numero di istruzioni in linguaggio macchina che vengono generate in
corrispondenza ad un programma scritto in un linguaggio ad alto livello,
dipende dal particolare compilatore. possibile dunque che uno stesso
programma venga tradotto in programmi in linguaggio macchina di lunghezza
(ossia numero di istruzioni) differente.
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 8
Secondo requisito della complessit computazionale (1)
2. Deve essere espressa in funzione dei dati in ingresso
Dato che un algoritmo elabora dei dati in ingresso per fornirne altri che
rappresentano la soluzione del problema, quello che interessa sapere come
il tempo di esecuzione dell'algoritmo varia al variare dei dati in ingresso. In
particolare, la dipendenza del tempo di esecuzione dai dati in ingresso al
problema pu essere relativa sia alla dimensione dei dati in ingresso che al
loro valore.
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 9
Secondo requisito della complessit computazionale (2)
a) Dipendenza dalla Dimensione dei Dati
La complessit computazionale di un algoritmo dipende sempre dal numero dei
dati che devono essere elaborati dall'algoritmo, ossia dai dati in ingresso. Tale
numero viene definito dimensione dei dati in ingresso.
Esempio:
algoritmo di ordinamento di un file o di un array, la dimensione coincide con la
lunghezza del file o dell'array. Nel seguito verr indicata con n la dimensione
dei dati in ingresso.
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 10
Secondo requisito della complessit computazionale (3)
b) Dipendenza dai Valori dei Dati
Pu accadere che i tempi di calcolo di un algoritmo in corrispondenza di una
determinata dimensione dei dati in ingresso, varino in funzione dei valori
assunti dagli stessi dati in ingresso.
Soluzione: un tempo di calcolo massimo e uno medio.
Tempo medio viene considerato il tempo medio di esecuzione su dati di
dimensione n, ottenuto considerando tutti i possibili valori dei dati in
ingresso, per ciascuno di essi determinando la complessit computazionale
e, infine, eseguendo la media dei valori di complessit computazionale
ottenuti difficile da ottenere per comprendere diversi scenari di dati in
ingresso
Tempo massimo il legame tra tempo di esecuzione e parametro n viene
fissato considerando i valori dei dati in ingresso che comportano il massimo
tempo di esecuzione caso peggiore, tale parametro il pi facile da
misurare.
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 11
Requisiti generali della Complessit computazionale
Occorre definire una misura che:
Faccia riferimento ad un modello astratto di calcolatore
Sia svincolata dalla particolare configurazione dei dati di ingresso
Sia funzione dalla dimensione dellinput (ossia dalla quantit dei dati in
ingresso)
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 12
Modello di macchina
Numerosi modelli e formalismi sono stati proposti per fornire un modello
astratto di macchina da utilizzare per valutare la complessit
computazionale
Tutti i modelli sono equivalenti Una computazione espressa in un
formalismo pu essere simulata mediante una computazione in un
formalismo differente
Un Modello di macchina una classe di dispositivi (macchine) strutturati in
maniera simile
La definizione matematica si basa sul linguaggio della teoria degli insiemi,
generalmente una macchina definita mediante strutture matematiche,
t-uple di elementi
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 13
Modello di macchina
Per semplificare, forniamo un modello astratto semplificato di calcolatore
rispetto al quale valutare i costi dellesecuzione di un programma
(svincolandoci dal modello fisico target del calcolatore):
Ogni istruzione ha un costo unitario
Ogni istruzione composta ha costo pari alla somma delle sue
componenti
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 14
Classificazione delle istruzioni per costo computazionale
Istruzioni atomiche
Condizioni atomiche
Strutture di controllo
Chiamate di funzione
Istruzioni e condizioni con chiamate di funzione
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 15
Calcolo del costo delle istruzioni
Istruzioni atomiche
Istruzioni semplici
Non si possono scomporre in sottocomponenti
Hanno costo unitario
Condizioni atomiche
Regolano i test delle strutture di controllo (p.e. confronti)
Hanno costo unitario
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 16
Calcolo del costo delle istruzioni
Strutture di controllo
Hanno costo pari al costo dellesecuzione delle istruzioni interne, pi la
somma dei costi delle condizioni
Chiamate di funzione
Hanno costo pari al costo dellesecuzione della funzione, istruzioni e
condizioni pi eventuali chiamate ad altre funzioni
Istruzioni e condizioni con chiamate di funzione
Hanno costo pari alla somma del costo delle funzioni invocate
aumentata di uno
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 17
Esempio: Ricerca sequenziale
Ricerca sequenziale
int ricerca_sequenziale(int v[ ],int n)
{
int i;
for(i=0; i<n; i++) {
if (v[i]== k) return 1;
}
return 0;
}
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 18
Esempio
Valutazione del costo dellesecuzione della funzione ricerca_sequenziale
quando n=8
p.e.:
Chiamata della funzione con i parametri
v[n]={1,3,9,17,34,95,96,101}
k=9
Costi:
1. Inizializzazione i=0 1
2. Confronti i<n 3 (effettuato in totale 3 volte)
3. Confronti v[i]==k 3 (effettuato in totale 3 volte)
4. Istruzioni i++ 2 (effettuato in totale 2 volte)
5. Istruzione return 1
Totale costo 10
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 19
Casi particolari di calcolo
Il modello di macchina proposto consente di valutare il costo
dellesecuzione di un programma su una specifica istanza dei dati di input.
Casi particolari
Caso peggiore: quando i dati di input assumono valori tali che il costo della
funzione sia massimo
Caso migliore: quando i dati di input assumono valori tali che il costo della
funzione sia minimo
Caso medio: fornisce una idea dei comportamenti che si presentano
comunemente
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 20
Caso peggiore
Se un algorimo sufficientemente efficiente nel caso peggiore, lo sar per
tutti i casi che potranno occorrere nella realt
Configurazioni dei dati di input per cui la funzione ha costo computazionale
massimo
Si considerano le condizioni pi sfavorevoli per lalgoritmocaso peggiore
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 21
Esempio di calcolo
Algoritmo di Ricerca sequenziale
Caso peggiore:
Il costo massimo quando il valore k cercato non viene trovato
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 22
Esempio di calcolo (caso peggiore)
Valutazione del costo della funzione ricerca sequenziale
1. Inizializzazione i=0 1
2. Confronti i<n n+1
3. Confronti v[i]==k n
4. Istruzioni i++ n
5. Istruzioni return 0 1
Totale costo 3n+3
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 23
Costo come funzione della dimensione dellinput
Costo nel caso peggiore dipende da n, dimensione dellinput
Si assume di dare unespressione del costo di un algoritmo in termini della
dimensione dellinput (n)
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 24
Problemi
Come scegliere il parametro da assumere come dimensione dellinput in
base al quale valutare la complessit di un programma?
Bisogna assicurarsi che tale parametro rappresenti la dimensione
dellinput vediamo un esempio
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 25
Esempio
int fatt(int n)
{
int i=1;
long fatt = 1;
while (i<=n) {
fatt = fatt * i;
i++;
}
return fatt;
}
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 26
Esempio
Valutazione del costo della funzione fattoriale
1. i=1; 1
2. fatt=1; 1
3. i<=n n+1
4. fatt=fatt*i n
5. i++ n
6. return fatt 1
Totale 3n+4
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 27
Dimensione dellinput
Nellesempio considerato si pu assumere come dimensione dellinput
1. il valore n in tal caso il costo 3n+4
2. il numero d di cifre decimali necessario per rappresentare n in decimale
in tal caso il costo circa uguale a 3*10
d
+4 piu grande il numero,
maggiore il costo computazionale
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 28
Osservazioni
Lassunzione fatta che le istruzioni semplici ed i confronti abbiano sempre
costo unitario ragionevole quando il costo indipendente dalla dimensione
dellinput
In altri casi ci non vero:
fatt =fatt*i
Il costo dipende dallinput in quanto il valore di fatt cresce dopo ogni
iterazione e, di conseguenza crescono
lo spazio necessario per la sua rappresentazione (p.e. long anzich int)
il costo per listruzione di assegnazione
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 29
Esempio: Ricerca binaria
Ricerca binaria (dicotomica)
int ricerca (int v[ ],int k)
{
int sx=0; int dx=N-1; int med;
while(dx>=sx) {
med= (dx+sx)/2;
if(k==v[med])
return 1;
else
if (k<v[med])
sx=med+1;
else
dx=med-1;
}
return 0;
}
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 30
Esempio
Caso peggiore quando il valore k non trovato nel vettore
Il numero di operazioni determinato da med=(dx+sx)/2
Il numero di operazioni proporzionale al numero di confronti dx>=sx
Ad ogni passo scartata la met degli elementi Il numero di elementi
considerati passa da n a n/2, n/4,..
Dopo i iterazioni, il numero di elementi e pari a n/2
i
Il numero di iterazioni per giungere al termine dellalgoritmo, quando il
numero di elementi 1, sar la soluzione dellequazione n/2
i
=1
Ossia: log
2
n lordine di grandezza del costo
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 31
Comportamento asintotico
Calcolo del costo di un algoritmo rispetto alla dimensione dei dati di
ingresso
Svantaggi Molto complicato
Soluzione:
Semplificare lanalisi
Calcolare il costo quando la dimensione dei dati di input cresce
allinfinito
Trascurare le costanti moltiplicative e i termini di ordine inferiore nella
funzione che esprime il costo
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 32
Comportamento asintotico
Lordine di grandezza del tempo di esecuzione di un algoritmo caratterizza
in modo sintetico lefficienza di un algoritmo e consente di confrontare fra
loro algoritmi diversi per la soluzione del medesimo problema
Quando si considerano input sufficientemente grandi si sta studiando
lefficienza asintotica dellalgoritmo
Ci che interessa la crescita del tempo di esecuzione al tendere allinfinito
della dimensione dellinput
In genere un algoritmo asintoticamente migliore di un altro lo in tutti i casi
(a parte input molto piccoli)
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 33
Esempio
Le funzioni a*n + b dove n la dimensione dellinput e a e b costanti
indipendenti dallinput sono equivalenti e sono lineari (n)
le funzioni del tipo : c*n
2
+ d * n + e quadratiche (n
2
)
le funzioni del tipo : f *log
2
n + h logaritmiche (log
2
n)
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 34
Studio del comportamento asintotico
Fornisce unidea del comportamento della complessit allaumentare della
dimensione dei dati di ingresso Fornisce una valutazione approssimata
delle prestazioni degli algoritmi
Rende le valutazioni della complessit insensibili rispetto alle
approssimazioni introdotte dal modello dei costi usato
Consente di semplificare i calcoli, evitando di determinare con precisione
le costanti in gioco
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 35
Notazione asintotica
La notazione asintotica un modo per indicare certi insiemi di funzioni
caratterizzati da specifici comportamenti allinfinito
Questi insiemi sono indicati dalle lettere
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 36
Notazione (g(n))
Con la notazione (g(n)) si indica linsieme di funzioni f(n) che
soddisfano la seguente condizione:
(g(n))={f(n): c1, c2, n0 tali che n n0 0 c1*g(n) f(n) c2*g(n) }
Ovvero f(n) appartiene a (g(n)) se esistono due costanti c1, c2 tali
che essa possa essere schiacciata fra c1*g(n) e c2*g(n) per n
sufficientemente grandi
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 37
Notazione (g(n))
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 38
Notazione O(g(n))
Con la notazione O(g(n)) si indica linsieme di funzioni f(n) che
soddisfano la seguente condizione
O(g(n))={f(n): c, n0 tali che n n0 0 f(n) c * g(n) }
Ovvero f(n) appartiene a O(g(n)) se esiste una costante c tale che
essa possa essere maggiorata da c*g(n) per n sufficientemente grandi
f(n) delimitata superiormente
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 39
Notazione O(g(n))
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 40
Notazione (g(n))
Con la notazione (g(n)) si indica linsieme di funzioni f(n) che
soddisfano la seguente condizione
(g(n))={f(n): c, n0 tali che n n0 0 c * g(n) f(n) }
Ovvero f(n) appartiene a (g(n)) se esiste una costante c tale che
essa sia sempre maggiore di c*g(n) per n sufficientemente grandi
f(n) delimitata inferiormente
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 41
Notazione (g(n))
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 42
Caso migliore / Caso peggiore
Dato che il caso migliore costituisce un limite inferiore al tempo di
calcolo, si usa la notazione (g(n)) per descrivere il comportamento del
caso migliore
Analogamente dato che il caso peggiore costituisce un limite superiore
al tempo di calcolo, si usa la notazione O(g(n)) per descrivere il
comportamento del caso peggiore
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 43
Esempi di Notazione O
Esempi:
O(n) = 3n + 5
per ogni n>=5
3n+5 < = 4n
O(n
2
)=4n
2
+16n+16
per ogni n>=17
4n
2
+16n+16 < = 5n
2
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 44
Esempi di Notazione
Esempi:
(n)=3n + 5
per ogni n>=1 (ossia per qualsiasi valore pratico)
3n + 5 >=n
(n
2
)=4n
2
+16n+16
per ogni n>=1 (ossia per qualsiasi valore pratico)
4n
2
+16n+16 >= n
2
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 45
Complessit di un problema
Dato un problema P si dice che ha delimitazione superiore di complessit
upper bound O(g(n)) se esiste un algoritmo A che risolve P con tempo di
esecuzione t
A
= O(g(n))
Dato un problema P si dice che ha delimitazione inferiore di complessit
lower bound (g(n)) se esiste un algoritmo A che risolve P con tempo di
esecuzione t
A
= (g(n))
Dato un problema P si dice che ha complessit (g(n)) se ha complessit
lower bound (g(n)) e upper bound O(g(n))
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 46
Confronto algoritmi di ordinamento
O(nlog(n)
2
)
per part. seq.
difficile da
calcolare
O(n
1,25
)
sperim.
O(n
2
) Shell
O(n log
2
n) O(n log
2
n) O(n
2
) Quicksort
O(n)
vettori quasi
ordinati
O(n
2
) O(n
2
) Bubble
O(n
2
) O(n
2
)
indipendente
dallinput
O(n
2
) Selection
O(n)
vettori quasi
ordinati
O(n
2
) O(n
2
) Insertion
Caso
migliore
Caso medio Caso
peggiore
Nome
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 47
Funzioni principali di interesse (1)
O(1) il tempo costante caratteristico di istruzioni che sono eseguite
una o al pi poche volte.
O(log n) il tempo logaritmico caratteristico di programmi che
risolvono un problema di grosse dimensioni riducendone la dimensione
di un fattore costante e risolvendo i singoli problemi pi piccoli. Quando
il tempo di esecuzione logaritmico il programma rallenta solo
leggermente al crescere di n: se n raddoppia log n cresce di un fattore
costante piccolo.
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 48
Funzioni principali di interesse (2)
O(n) il tempo lineare caratteristico di programmi che eseguono
poche operazioni su ogni elemento dellinput. Se la dimensione
dellingresso raddoppia, raddoppia anche il tempo di esecuzione.
O(n*log n) il tempo n*log n caratteristico di programmi che
risolvono un problema di grosse dimensioni riducendoli in problemi
pi piccoli, risolvendo i singoli problemi pi piccoli e ricombinando i
risultati per ottenere la soluzione generale. Se n raddoppia n log n
diventa poco pi del doppio.
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 49
Funzioni principali di interesse (3)
O(n
2
) il tempo quadratico caratteristico di programmi che
elaborano linput a coppie. Algoritmi con tempo quadratico si
usano per risolvere problemi abbastanza piccoli. Se n raddoppia n
2
quadruplica.
O(2
n
) il tempo esponenziale caratteristico di programmi che
elaborano linput considerando tutte le possibili permutazioni.
Rappresentano spesso la soluzione naturale pi diretta e facile di
un problema.
Algoritmi con tempo esponenziale raramente sono applicabili a
problemi pratici. Se linput raddoppia il tempo di esecuzione viene
elevato al quadrato
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 50
Curiosit sui secondi
.....mai 10
11
3.1 secoli 10
10
3.1 decenni 10
9
3.1 anni 10
8
3.8 mesi 10
7
1.6 settimanei 10
6
1.1 giorni 10
5
2.8 ore 10
4
1.7 minuti 10
2
secondi
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 51
Numero operazioni
(quasi) 10
24
3*10
13
32 10
12
(quasi) 10
12
2*10
7
17 10
6
10
300
10
6
10
4
10 10
3
10
30
10
4
7*10
2
7 10
2
10
3
10
2
30 3 10
2
N
N
2
N log N log N N
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 52
Tempi di calcolo
10
12
10
6
10
3
10
2
10
N
.....mai .....mai mesi istantaneo settimane
.....mai settimane secondi istantaneo secondi
.....mai secondi istantaneo istantaneo istantaneo
.....mai istantaneo istantaneo istantaneo istantaneo
secondi istantaneo istantaneo istantaneo istantaneo
2
N
N
2
N log N log N N
Tempo impiegato da un calcolatore capace di 10
6
operazioni al secondo
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 53
Riepilogo della lezione
Complessit computazionale
Efficienza di algoritmi
Modelli di riferimento
Calcolo della complessit
Comportamento asintotico
Notazione asintotica
Fondamenti di Informatica II A.A. 2008-2009 a cura di Pascoschi Giovanni 54
Fine della lezione
Domande?

Potrebbero piacerti anche