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