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.

2.2 Due <strong>algoritmi</strong> <strong>di</strong> or<strong>di</strong>namento iterativi<br />

Il problema dell’or<strong>di</strong>namento è quello <strong>di</strong> or<strong>di</strong>nare in modo crescente o decrescente, in base ad una qualche<br />

definizione <strong>di</strong> relazione d’or<strong>di</strong>ne, un insieme <strong>di</strong> elementi. In questa sezione presentiamo due <strong>algoritmi</strong> <strong>di</strong><br />

or<strong>di</strong>namento non ricorsivi. Nelle sezioni successive torneremo sul problema e definiremo altri <strong>algoritmi</strong><br />

più efficienti. Consideriamo <strong>il</strong> caso in cui l’insieme sia memorizzato in un array. Il primo algoritmo<br />

che consideriamo, chiamato selection-sort (or<strong>di</strong>namento <strong>per</strong> selezione) è <strong>il</strong> seguente: dato un array <strong>di</strong> n<br />

elementi, si cerca l’elemento più piccolo e lo si mette al primo posto. Poi si cerca <strong>il</strong> più piccolo fra i<br />

rimanenti n − 1 elementi e lo si mette al secondo posto, e così via. Una possib<strong>il</strong>e funzione è la seguente.<br />

Essa usa una funzione che scambia due elementi <strong>di</strong> un array. Supponiamo che gli elementi dell’array<br />

siano interi.<br />

void exchange ( int & x, int & y) {<br />

int temp ;<br />

temp =x; x=y; y= temp ;<br />

}<br />

void selectionSort ( int *A, int n) {<br />

for ( int i =0; i< n -1; i ++) {<br />

int min = i;<br />

for ( int j=i +1; j< n; j ++)<br />

if (A[j] < A[ min ]) min =j;<br />

exchange (A[i], A[ min ]);<br />

}<br />

}<br />

Calcoliamo ora, ut<strong>il</strong>izzando la regola induttiva definita nella precedente sezione, la complessità del<br />

tempo <strong>di</strong> esecuzione della procedura definita, in funzione del numero <strong>di</strong> elementi nell’array, cioè n. Si<br />

vede fac<strong>il</strong>mente che <strong>il</strong> tempo <strong>di</strong> tutti gli assegnamenti del programma è O(1); come esempio, consideriamo<br />

j=i+1;:<br />

C[[j = i + 1]] = C[[i + 1]] = C[[i]] + C[[1]] = O(1) + O(1) = O(1)<br />

dove l’ultimo passaggio è ottenuto ut<strong>il</strong>izzando la regola della somma. Calcoliamo ora la complessità<br />

del comando con<strong>di</strong>zionale:<br />

C[[if(A[j] < A[min])min = j]] = C[[A[j] < A[min]]] + C[[min = j]] = O(1) + O(1) + O(1) = O(1)<br />

Consideriamo ora <strong>il</strong> for più interno. Il suo corpo viene eseguito n − i − 1 volte all’i-esima iterazione.<br />

Possiamo fare qualche considerazione <strong>per</strong> esprimere <strong>il</strong> tempo in termini solo <strong>di</strong> n. Poiché i non <strong>di</strong>venta<br />

mai minore <strong>di</strong> 0, abbiamo che n − 1 è un limite <strong>per</strong> n − i. Quin<strong>di</strong> un limite al numero <strong>di</strong> volte in cui <strong>il</strong><br />

for è eseguito è n − 1, che è O(n). Abbiamo:<br />

C[[for . . .]] = = C[[i + 1]] + (C[[n − 1]] + C[[if . . .]] + C[[j + +]])O(n) = O(1) + O(1) + O(1)O(n) = O(n)<br />

dove l’ultimo passagio è ottenuto applicando le regole della somma e del prodotto. L’assegnamento<br />

min=i e la chaimata alla funzione exchange hanno complessità costante. Quin<strong>di</strong> <strong>il</strong> corpo del for più<br />

esterno ha complessità O(n). Poiché esso è eseguito, n − 1 volte, <strong>il</strong> for ha complessità O(n 2 ). Infine,<br />

poiché <strong>il</strong> blocco più esterno è costituto dal solo comando for, abbiamo che O(n 2 ) è anche l’or<strong>di</strong>ne <strong>di</strong><br />

complessità del tempo <strong>di</strong> esecuzione dell’intera funzione. Nel calcolo della complessità fin qui descritto,<br />

abbiamo approssimato <strong>per</strong> eccesso <strong>il</strong> tempo del ciclo più interno supponendo che ogni sua iterazione<br />

10

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

Saved successfully!

Ooh no, something went wrong!