30.05.2013 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!