COMPLESSITÀ COMPUTAZIONALE
Fondamenti di Informatica A - Massimo Bertozzi
Tipi di complessità
✗
Consideriamo l'analisi della complessità di
un programma da due punti di vista:
✗
spazio
✗
tempo
Fondamenti di Informatica A - Massimo Bertozzi
Complessità Spaziale
Lo spazio utilizzato da un programma può essere visto
come la somma di due differenti componenti:
•
•
Spazio fisso:
•
spazio testo
•
variabili
•
array di dimensioni fisse
•
costanticon nome
Spazio variabile:
•
variabili allocate dinamicamente
•
stack
Fondamenti di Informatica A - Massimo Bertozzi
una funzione iterativa
float somma(float lista[], int n)
{
float sommatemp=0;
int ii;
for(ii=0; ii<n; ii++)
sommatemp += lista[ii];
return sommatemp;
}
Fondamenti di Informatica A - Massimo Bertozzi
una funzione ricorsiva
float sommar(float lista[], int n)
{
if (n)
return sommar(lista, n-1) + lista[n-1];
else
return 0;
}
Fondamenti di Informatica A - Massimo Bertozzi
Confronto complessità
Consideriamo le funzioni viste in precedenza, senza
considerare lo spazio richiesto per la chiamata alla
funzione (ipotizziamo n=100):
Nel caso della funzione iterativa la complessità spaziale
S è:
S = sizeof(float) + sizeof(int) (= 6);
Nel caso della funzione ricorsiva:
S = n*sizeof(float) (=400);
Per ogni programma ricorsivo esiste un programma
non-ricorsivo più efficiente.
Fondamenti di Informatica A - Massimo Bertozzi
Complessità temporale
✗
✗
La complessità temporale può essere vista
come somma di due componenti:
✗
tempo di compilazione
✗
tempo di esecuzione
La rilevanza dei due dipende dalla natura
del linguaggio di programmazione utilizzato
Fondamenti di Informatica A - Massimo Bertozzi
tempo di compilazione
• Durante la fase di sviluppo un programma
in C/C++ può essere ricompilato più volte
• Ciononostante l'esecuzione di un
programma non richiede la ricompilazione
L'unica quantità che interessa realmente
è il tempo di esecuzione!
Fondamenti di Informatica A - Massimo Bertozzi
Tempo di esecuzione
Richiede una profonda conoscenza del
compilatore;
È strettamente dipendente dalle
ottimizzazioni effettuate;
Viene influenzato dall'architettura su cui il
programma viene eseguito;
Fondamenti di Informatica A - Massimo Bertozzi
time.h
La libreria time.h mette a disposizione
funzioni predefinite e tipi di dato per la
gestione del tempo, fra cui:
clock_t (tipo di dato)
clock_t clock(void) (funzione)
CLOCKS_PER_SEC (costante)
Fondamenti di Informatica A - Massimo Bertozzi
Passo di programma
✗
Una stima della complessità temporale di
un algoritmo può essere effettuata
contando il numero di operazioni svolte
✗
Si definisce Passo di Programma (Program
Step): un segmento di codice autonomo e
coerente dal punto di vista semantico o
sintattico
Fondamenti di Informatica A - Massimo Bertozzi
Passo di programma (2)
Il tempo di esecuzione di un passo di
programma è indipendente dalle istanze da cui
è composto;
La valutazione delle prestazioni mediante il
conteggio dei passi di programma eseguiti è
indipendente sia dal calcolatore utilizzato che
dal compilatore;
Una valutazione corretta della complessità
temporale tramite il conteggio dei passi di
programma dovrà considerare: caso peggiore,
caso migliore e caso medio.
Fondamenti di Informatica A - Massimo Bertozzi
Precisione
Come si può intuire l'utilizzo dei passi di
programma per l'analisi della complessità
temporale non consente una valutazione
precisa.
D'altro canto, la determinazione esatta della
complessità temporale non sempre è
necessaria o possibile;
È importante capire qual è l'andamento
qualitativo della complessità temporale al
variare delle dimensioni del problema e in
particolare quando diventano molto grandi.
Fondamenti di Informatica A - Massimo Bertozzi
La notazione asintotica
Definizione: si definisce complessità
asintotica di un problema la complessità
assunta da questo problema quando le sue
dimensioni (n) tendono a valori molto
grandi.
Fondamenti di Informatica A - Massimo Bertozzi
O(f(n))
Una funzione g(n) è detta appartenere alla
classe di funzioni O(f(n)) o essere di ordine
f(n) quando è possibile individuare due
costanti c0 e n0 tali per cui vale:
g(n)<c0f(n) per tutti gli n>n0
Fondamenti di Informatica A - Massimo Bertozzi
Esempi di O(f(n))
✗
O(1) complessità costante;
✗
O(n) complessità lineare;
✗
O(n2) complessità quadratica;
✗
...
✗
✗
O(nlogn) complessità sottolineare;
Le precedenti sono considerate complessità
polinomiali
✗ O(kn) complessità esponenziale.
Fondamenti di Informatica A - Massimo Bertozzi
Andamento di O(f(n))
Fondamenti di Informatica A - Massimo Bertozzi
Bubble sort
✗
Il Bubble Sort è uno dei più intuitivi algoritmi di
ordinamento per scambio:
✗ si confrontano i primi due elementi di una lista;
✗
se non sono ordinati li si scambiano;
✗
si considerano i successivi elementi e si ripetono
i primi due passi;
✗
terminata la scansione della lista si ripete senza
considerare l'ultimo elemento della lista.
✗
nel caso non vengano effettuati scambi deduco
che la lista sia già ordinata!
Fondamenti di Informatica A - Massimo Bertozzi
Bubblesort: complessità
✗
Caso ottimo: (vettore ordinato) T(n)=n-1
✗
Caso pessimo: (vettore ordinato in senso
inverso) T(n)=n(n-1)/2
✗
Caso medio: T(n)=(n2+n·ln(n))/2
2
La complessità asintotica è O(n )
Fondamenti di Informatica A - Massimo Bertozzi
Quicksort
✗
Il Quick Sort è un algoritmo di ordinamento
che si basa sulla divisione iterativa della lista
da ordinare:
✗ si sceglie un elemento della lista detto
perno (pivot);
✗
si suddivide la lista in maniera che tutti gli
elementi minori del perno si trovino alla sua
sinistra e i maggiori alla sua destra;
✗
si ripete la procedura sui due sottoinsiemi
individuati;
Fondamenti di Informatica A - Massimo Bertozzi
Quicksort: complessità
✗
Caso ottimo: (vettore disordinato)
T(n)=2T((n-1)/2)+Pn
✗
Caso pessimo: (vettore ordinato)
T(n)=T(n-1)+Pn
✗
Caso medio:
nlog2n
La complessità asintotica è O(nlog2n)
Fondamenti di Informatica A - Massimo Bertozzi