Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
La complessità
Complessità in tempo e spazio
Complessità asintotica
Algoritmi e complessità
Ricerca e ordinamento
La macchina di Turing e le classi di
complessità
Complessità spaziale
Si misurano le “posizioni” di memoria occupate dai dati
necessari allo svolgimento dell’algoritmo
La complessità spaziale sarà misurata relativamente alla
memoria principale se i dati dell’algoritmo possono essere
allocati in memoria principale, in base all’occupazione di
memoria secondaria quando le strutture dati dell’algoritmo
sono troppo grandi per poter risiedere nella memoria
centrale
Informalmente…
L’ordine O (f(n)) fornisce una misura della complessità
temporale di ogni programma che implementa l’algoritmo
Esempio:
Esempio Calcolare la somma degli elementi di un array
n: numero di elementi dell’array
complessità: O (n)
Array
n: numero degli elementi dell’array
Ricerca/inserimento/cancellazione di un elemento
Complessità O (n)
Liste semplici
n: numero delle posizioni nella lista
Ricerca/cancellazione di un elemento
Complessità O (n)
Inserimento di un elemento all’inizio della lista (in testa)
Complessità O (1)
3 8
1 4 7 9
Problema
Memorizzare in maniera opportuna un insieme di dati
tipicamente sotto forma di record in modo da poter
reperire un qualsiasi elemento dell’insieme con un
numero “piccolo” di tentativi
Cosa significa “piccolo” ?
Indipendente (o quasi) dalla dimensione della tabella su cui
si effettua la ricerca, quindi con una complessità in tempo
pari ad O (1)
h: K → {0, 1, 2, …, m–1}
K: insieme dei valori distinti che possono essere assunti
dalle chiavi dei record
m: dimensione del vettore in cui si intende memorizzare
la tabella
Ipotesi:
Ipotesi K sottoinsieme dei numeri naturali
Possibile funzione di accesso:
h(k) k MOD m, kK
Valore della funzione sempre compreso fra 0 e m–1
Esempio:
Esempio array di 19 elementi (indicizzati da 0 a 18) 12 20, 39
Posizione 0 ← 57 3 60
Posizione 8 ← 27 4 23, 42
5
Posizione 1 ← 20, 39 6 44
Posizione 10 ← 10 7 45
Posizione 7 ← 45 16
17
Fondamentale:
Fondamentale perché gli algoritmi a complessità
esponenziale sono considerati quasi inusabili?
Perché richiedono talmente tante operazioni che
probabilmente anche i calcolatori futuri non saranno in
grado di eseguire in tempi ragionevoli le loro possibili
implementazioni (programmi) per dati in ingresso ad alta
dimensionalità
0 2 4 5 8 9 13 16 20 23 27 30 34 35
Ci si concentra sulla metà destra (da ind. 8 a ind. 14): si confronta 23 con 27
0 2 4 5 8 9 13 16 20 23 27 30 34 35
Ci si concentra sulla metà sinistra (da ind. 8 a ind. 10): si confronta 23 con 20
0 2 4 5 8 9 13 16 20 23 27 30 34 35
Divisione
6 1 2 8 3 4 7 5
Ordinamento Ordinamento
1 2 6 8 3 4 5 7
Fusione
1 2 3 4 5 6 7 8
Divisione
6 1 2 8 3 4 7 5
6 1 2 8 3 4 7 5
6 1 2 8 3 4 7 5
1 2 3 4 5 6 7 8
Fusione
1 2 6 8 3 4 5 7
1 6 2 8 3 4 5 7
6 1 2 8 3 4 7 5
1 2 6 8
i 1 2 3 4 5 6 7 8
3 4 5 7
k
j
Fondamenti di Informatica I a.a. 2008-09 34
Complessità del Mergesort
3 2 1 4 6 8 7 5
3 2 1 6 8 7 5
1 2 3 5 6 7 8
1 2 5 7 8
i j
Si scambia A[j] con il perno
4 2 1 3 6 8 7 5
3 2 1 4 6 8 7 5
38 23 38 23
12 28 17 22 12 28 17 22
10 5 18 10 5
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
63 38 23 12 28 17 22 10 5 18 18 38 23 12 28 17 22 10 5 63
Continua… 47
Fondamenti di Informatica I a.a. 2008-09
Heapsort 3
Si considera il massimo fra i due figli della radice e, se
max{A[2],A[3]}A[1], si effettua lo scambio
18 38
12 28 17 22 12 28 17 22
10 5 10 5
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
18 38 23 12 28 17 22 10 5 63 38 18 23 12 28 17 22 10 5 63
Continua… 48
Fondamenti di Informatica I a.a. 2008-09
Heapsort 4
Si considera il massimo fra i due figli di A[2] e, se
max{A[4],A[5]}A[2], si effettua lo scambio
38 38
12 28 17 22 12 18 17 22
10 5 10 5
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
38 18 23 12 28 17 22 10 5 63 38 28 23 12 18 17 22 10 5 63
Continua… 49
Fondamenti di Informatica I a.a. 2008-09
Heapsort 5
Si estrae A[1] che è l’elemento più grande… e si ricomincia
il procedimento di ricostruzione
38 5
28 23 28 23
12 18 17 22 12 18 17 22
10 5 10
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
38 28 23 12 18 17 22 10 5 63 5 28 23 12 18 17 22 10 38 63
/* si costruisce lo heap */
for (ksize2; k1; k)
heap(p, k, size);
/* si scambia l’elemento più grande con quello finale
* e si ricostruisce lo heap
*/
while (size1)
{
temp p[1];
p[1] p[size];
p[size] temp;
heap(p, 1, size);
}
exit(0);
}
Fondamenti di Informatica I a.a. 2008-09 52
Heapsort 8
/* Costruzione topdown di uno heap */
#define LESS(A,B)((A)(B))