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