Appunti per il modulo di algoritmi e strutture dati - Sezione di ...
Appunti per il modulo di algoritmi e strutture dati - Sezione di ...
Appunti per il modulo di algoritmi e strutture dati - Sezione di ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
1 Complessità computazionale<br />
1.1 Tempo <strong>di</strong> esecuzione dei programmi<br />
Si <strong>di</strong>ce complessità <strong>di</strong> un algoritmo la funzione che associa alla “<strong>di</strong>mensione” del problema <strong>il</strong> costo della<br />
sua risoluzione in base alla misura scelta. Possib<strong>il</strong>i misure sono <strong>il</strong> tempo <strong>di</strong> esecuzione o lo spazio <strong>di</strong><br />
memoria.<br />
Supponiamo <strong>di</strong> voler valutare <strong>il</strong> tempo <strong>di</strong> esecuzione <strong>di</strong> un programma. Possiamo provarlo su un insieme<br />
significativo <strong>di</strong> ingressi e misurare <strong>il</strong> tempo <strong>di</strong> esecuzione. Quasi tutti gli ambienti <strong>di</strong> programmazione<br />
forniscono uno strumento <strong>di</strong> prof<strong>il</strong>ing, <strong>per</strong> mezzo del quale è possib<strong>il</strong>e associare ad ogni istruzione un<br />
tempo e calcolare così <strong>il</strong> tempo totale <strong>di</strong> una esecuzione. Vedremo come sia possib<strong>il</strong>e invece dare una<br />
misura dell’efficienza in termini <strong>di</strong> tempo, svincolata dalla particolare macchina sulla quale i programmi<br />
vengono eseguiti. Naturalmente, nei casi concreti <strong>di</strong> progetto <strong>di</strong> <strong>algoritmi</strong>, tale misura è solo in<strong>di</strong>cativa<br />
e dovrà essere considerata insieme agli altri fattori che possono influenzare <strong>il</strong> tempo reale <strong>di</strong> esecuzione.<br />
Ovviamente <strong>il</strong> tempo <strong>di</strong> esecuzione <strong>di</strong> un programma <strong>di</strong>pende dalla <strong>di</strong>mensione degli ingressi. La<br />
prima cosa da fare <strong>per</strong> valutare un programma è quin<strong>di</strong> in<strong>di</strong>viduare qual’è la <strong>di</strong>mensione o misura degli<br />
ingressi. Questa misura può variare da programma a programma. Per esempio, <strong>per</strong> un programma <strong>di</strong><br />
or<strong>di</strong>namento la <strong>di</strong>mensione è in genere <strong>il</strong> numero <strong>di</strong> elementi da or<strong>di</strong>nare, <strong>per</strong> un programma che risolve<br />
sistemi <strong>di</strong> equazioni è <strong>il</strong> numero delle incognite, <strong>per</strong> un programma su liste la lunghezza delle liste, <strong>per</strong><br />
un programma che lavora su matrici <strong>il</strong> numero <strong>di</strong> righe e <strong>di</strong> colonne.<br />
Dato un programma P , chiamiamo TP (n) (o semplicemente T (n) quando <strong>il</strong> programma cui ci si<br />
riferisce è chiaro dal contesto) <strong>il</strong> tempo <strong>di</strong> esecuzione <strong>di</strong> P <strong>per</strong> ingressi <strong>di</strong> <strong>di</strong>mensione n. Più precisamente,<br />
T (n) in<strong>di</strong>ca <strong>il</strong> numero <strong>di</strong> unità <strong>di</strong> tempo che P impiega <strong>per</strong> elaborare un ingresso <strong>di</strong> <strong>di</strong>mensione n. T (n)<br />
è una funzione da N in N (N → N), dove con N in<strong>di</strong>chiamo gli interi non negativi.<br />
Esempio 1.1<br />
Consideriamo la seguente funzione max che cerca <strong>il</strong> massimo in un array <strong>di</strong> n interi.<br />
int max ( int *a, int n) {<br />
int m=a [0];<br />
for ( int i =1; i < n; i ++)<br />
if (m < a[i]) m=a[i];<br />
return m;<br />
}<br />
Supponiamo <strong>per</strong> ora che <strong>il</strong> calcolatore impieghi una unità <strong>di</strong> tempo <strong>per</strong> ogni assegnamento ed ogni<br />
confronto. Il tempo <strong>per</strong> l’assegnamento m=a[0] sarà quin<strong>di</strong> 1, mentre <strong>il</strong> tempo <strong>per</strong> <strong>il</strong> comando con<strong>di</strong>zionale<br />
sarà 1 o 2 a seconda che si esegua <strong>il</strong> confronto e l’assegnamento oppure solo <strong>il</strong> confronto. Se consideriamo<br />
<strong>il</strong> caso peggiore, possiamo <strong>di</strong>re che <strong>il</strong> tempo è 2. Il corpo del comando ripetitivo viene eseguito n − 1 volte<br />
ed ogni volta <strong>il</strong> tempo è 2 <strong>per</strong> <strong>il</strong> comando con<strong>di</strong>zionale più 1 <strong>per</strong> l’incremento <strong>di</strong> i più 1 <strong>per</strong> <strong>il</strong> confronto.<br />
Quin<strong>di</strong> <strong>il</strong> tempo <strong>per</strong> <strong>il</strong> comando ripetitivo è 4n − 4 più 1 <strong>per</strong> l’iniziale assegnamento i=1 più 1 <strong>per</strong> l’ultimo<br />
incremento i++. Il tempo del comando return è 1. Il tempo dell’intero programma si ottiene sommando<br />
i tempi dei suoi coman<strong>di</strong>, quin<strong>di</strong> in conclusione abbiamo Tmax(n) = 4n.<br />
La nostra assunzione che <strong>il</strong> tempo <strong>di</strong> esecuzione <strong>di</strong> un assegnamento o <strong>di</strong> un confronto sia l’unità <strong>di</strong><br />
tempo non corrisponde generalmente alla verità. Per esempio, <strong>il</strong> tempo <strong>di</strong> valutazione dell’espressione<br />
alla destra <strong>di</strong> un assegnamento varia a seconda della complessità dell’espressione: infatti la traduzione in<br />
linguaggio macchina <strong>di</strong> assegnamenti <strong>di</strong>versi può risultare in generale in una sequenze <strong>di</strong> istruzioni macchina<br />
<strong>di</strong> <strong>di</strong>versa lunghezza. Inoltre, anche la traduzione dello stesso assegnamento può portare a <strong>di</strong>verse<br />
sequenze se si ut<strong>il</strong>izzano due comp<strong>il</strong>atori <strong>di</strong>versi. Il <strong>di</strong>scorso si estende ulteriormente se si considerano<br />
4