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