valutazione empirica delle prestazioni:
stima o misura?
si misurano le prestazioni di
di un'implementazione
dell'algoritmo
si procede dalla misura alla stima
delle prestazioni
dell'algoritmo astraendo
(per quanto possibile) dall'influenza di caratteristiche
specifiche dell'implementazione
a tale scopo è spesso necessaria un'analisi del codice, per:
capire quali parti siano più critiche per le prestazioni
(ad es., cicli più interni)
capire se tali criticità siano dovute all'algoritmo o all'implementazione
problema inerente della stima empirica:
dipendenza dall'implementazione
per la correttezza metodologica del
confronto empirico
delle prestazioni di diversi algoritmi, si richiede che
le implementazioni abbiano la stessa accuratezza
assunto:
dipendenza delle prestazioni dell'algoritmo da un
parametro primario N
(uno solo, per semplicità e senza perdita di generalità)
il tempo di esecuzione ("costo" più significativo degli
algoritmi nella maggior parte dei casi) tipicamente cresce come una
delle seguenti funzioni di N, e la
rispettiva crescita si dice:
l'andamento, per un campione di valori, di funzioni comunemente
incontrate mostra che il loro confronto per
piccoli valori di N può essere
anche molto diverso da quello per grandi
valori di N, determinato dalla velocità di crescita
asintotica delle funzioni considerate:
lg N
N1/2
N
N lg N
N(lg N)2
N3/2
N2
3
3
10
33
110
32
102
7
10
102
664
4414
1000
104
10
32
103
9966
∼105
∼3.2 ⋅ 104
106
13
100
104
∼1.3 ⋅ 105
∼1.7 ⋅ 106
106
108
17
316
105
∼1.7 ⋅ 106
∼2.8 ⋅ 107
∼3.2 ⋅ 107
1010
20
1000
106
∼2 ⋅ 107
∼4 ⋅ 108
109
1012
N.B.
la fattibilità pratica di un algoritmo è notevolmente sensibile
all'ordine di grandezza
del tempo di esecuzione:
105 secondi
∼ 1 giorno, 108 secondi
∼ 3 anni
dimostrare che
⌊ lg
N⌋ + 1
= ⌈
lg(N+1)
⌉
per ogni intero positivo N > 0
il testo (Sedgewick, 2003, p. 41) propone due metodi simili,
espressi da rispettive istruzioni C++, per il calcolo
del più piccolo intero maggiore di lg N :
for (lgN = 0; N > 0; lgN++, N /= 2) ;
for (lgN = 0, t = 1; t < N; lgN++, t += t) ;
dimostrare che i due metodi non sono equivalenti; più precisamente,
trovare e correggere l'errore nel secondo metodo, posto che il valore
della variabile intera
lgN
debba essere, all'uscita dal ciclo, il più piccolo intero maggiore di
lg N