La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

1 Algoritmi di ordinamento Fondamenti di Informatica Prof. Ing. Salvatore Cavalieri.

Presentazioni simili


Presentazione sul tema: "1 Algoritmi di ordinamento Fondamenti di Informatica Prof. Ing. Salvatore Cavalieri."— Transcript della presentazione:

1 1 Algoritmi di ordinamento Fondamenti di Informatica Prof. Ing. Salvatore Cavalieri

2 2 Introduzione Ordinare una sequenza di informazioni significa effettuare una permutazione in modo da rispettare una relazione dordine tra gli elementi della sequenza (p.e. minore o uguale ovvero non decrescente) Sulla sequenza ordinata diventa più semplice effettuare ricerche

3 3 Campi chiave Lordinamento di una sequenza viene fatto scegliendo almeno un campo, definito chiave, che è quello utilizzato per la ricerca nella sequenza. In pratica ricerchiamo le informazioni di tutto lelemento utilizzando una parte nota di esso, la chiave È molto comune la ricerca per più di un campo (chiavi multiple) Le chiavi vanno scelte in modo da ridurre le possibili omonimie Ad esempio nella rubrica cerchiamo principalmente per cognome e poi per nome Lordinamento è quindi spesso effettuato su più di un campo: chiave primaria, secondaria etc.

4 4 Esempio 1. Rossi Paolo Rossi Carlo Bianchi Agata Considerando lo scopo applicativo, la sequenza va ordinata per cognome e nome, in ordine non decrescente. Si ottiene così: 1. Bianchi Agata Rossi Carlo Rossi Paolo

5 5 Complessità computazionale È importante avere un indicatore di confronto tra i vari algoritmi possibili di ordinamento, indipendentemente dalla piattaforma hw/sw e dalla struttura dellelemento informativo La complessità computazionale si basa sulla valutazione del numero di operazioni elementari necessarie (Confronti, Scambi) Si misura come funzione del numero n di elementi della sequenza Gli algoritmi di ordinamento interno si dividono in Algoritmi semplici - complessità O(n 2 ) Algoritmi evoluti - complessità O(n*log(n))

6 6 Ordinamenti interni ed esterni Gli ordinamenti interni sono fatti su sequenze in memoria centrale Gli ordinamenti esterni sono fatti su sequenze in memoria di massa

7 7 Ipotesi Consideriamo solo ordinamenti interni Supporremo che la sequenza di informazioni sia rappresentabile come vettore di n elementi, ovvero ogni elemento sia individuabile tramite un indice variabile da 0 a n-1. Gli elementi del vettore potranno essere tipi scalari (ad esempio interi o virgola mobile) o aggregati (struct)

8 8 Bubble Sort Si tratta di un algoritmo semplice. Il nome deriva dalla analogia dei successivi spostamenti che compiono gli elementi dalla posizione di partenza a quella ordinata simile alla risalita delle bolle di aria in un liquido. Il bubbling si può realizzare in molte versioni basate sullo stesso principio.

9 9 Descrizione informale Si consideri un vettore di n elementi. Si vogliono ordinare gli elementi in ordine non decrescente Facciamo risalire le bolle dal fondo Sono necessarie al più n-1 scansioni del vettore (iterazioni) Si utilizza un flag ordinato, che viene inizializzato a 1 allinizio di ogni ciclo (ossia si ipotizza il vettore ordinato) Ad ogni ciclo vengono confrontati gli elementi del vettore, e se essi non sono nellordine desiderato, vengono scambiati

10 10 Descrizione informale (cont.) Alla generica iterazione j (j=0,..,j=n-2), vengono considerati tutti gli elementi del vettore di indice i, tale che (i=n-1,…,i=j+1) Il confronto riguarda gli elementi di indice i e di indice i-1 Se durante la generica iterazione cè almeno uno scambio, settiamo a 0 il flag ordinato. Se durante la generica iterazione, non viene fatto nessuno scambio, allora il flag ordinato à posto a 1 e ciò determina la fine prematura dellalgoritmo.

11 11 Codice C del Bubble Sort 1. #include 2. void scambia(tipobase v[], unsigned long i, unsigned long j) 3. { 4. tipobase tmp=v[i]; 5. v[i]=v[j]; 6. v[j]=tmp; 7. }

12 12 Codice C del Bubble Sort (cont.) 1. void BubbleSort(tipobase v[], unsigned long dim) 2. { 3. short ordinato=0; 4. unsigned long i,j; 5. for (j=0; jj; i--) 8. if (v[i]

13 13 Quick Sort Si tratta di un algoritmo evoluto che ha complessità computazionale n*log(n) ed inoltre usa la ricorsione. Si consideri un vettore di n elementi e lo si ordini con algoritmi semplici, con un tempo di calcolo proporzionale a n 2.. Si supponga, invece di dividere il vettore da ordinare in due sottovettori di n/2 elementi ciascuno e di ordinare le due metà separatamente. Applicando sempre gli algoritmi non evoluti, si avrebbe un tempo di calcolo pari a (n/2) 2 + (n/2) 2 =n 2 /2. Se riunendo i due sottovettori ordinati si potesse riottenere il vettore originario tutto ordinato avremmo dimezzato il tempo di calcolo Se questo ragionamento si potesse applicare anche immaginando una decomposizione del vettore originario in quattro, si avrebbe un tempo di calcolo totale pari a: (n/4) 2 + (n/4) 2 + (n/4) 2 + (n/4) 2 =n 2 /4. Se si potesse dividere in 8, si avrebbe un tempo ancora più basso, e così via dicendo.

14 14 Il ragionamento descritto prima non funziona sempre Il vincolo da porre è chiaro: possiamo applicare questo metodo solo se il massimo elemento in A1 è inferiore o uguale al minimo elemento di A2 (ordinamento crescente) Loperazione che crea due parti con la suddetta caratteristica si dice partizionamento del vettore. Quick Sort A1A2

15 15 Quick Sort: Esempio Scegliamo come pivot lelemento di indice m=(inf+sup)/2, ovvero v[4]=15. Lindice i viene fatto incrementare fino a quando si trova un elemento maggiore o uguale al pivot Lindice j viene fatto decrementare fino a quando si trova un elemento minore o uguale al pivot Si consideri il seguente vettore, v, di n=10 elementi: i=infj=sup i j

16 16 Gli elementi di indice i e j vengono scambiati, e lindice i viene incrementato, mentre j viene decrementato, ottenendo: ij Lindice i viene arrestato in quanto esso corrisponde al pivot. Lindice j viene fatto decrementare fino a quando esso perviene allelemento 15, che è uguale al pivot. Gli indici sono dunque: i,j Quick Sort: Esempio (cont)

17 17 Lalgoritmo procede ricorsivamente operando sui vettori delimitati dagli indici (inf,..,j) e (i,..,sup). Gli elementi i e j non vengono scambiati, perché non avrebbe senso visto che i e j coincidono, e successivamente i viene incrementato e j viene decrementato, ottenendo linversione degli indici ( i > j ) e la conclusione del primo passo del QuickSort, Il vettore è così partizionato: ji Quick Sort: Esempio (cont) Gli elementi di indice appartenente a inf,..,j sono minori o uguali al pivot Gli elementi di indice appartenente a i..sup sono superiori o uguali al pivot Gli elementi di indice tra j+1,..,i-1 sono uguali al pivot (nel nostro esempio cè un solo elemento)

18 18 Quick Sort: Esempio (cont) i=infj=suppivot= ij i,j inf,ji sup

19 19 Quick Sort: Esempio (cont) i=infj=sup i pivot= i,supinf,j j Fine ricorsione sul sotto-vettore di sinistra, si procede su quello di destra

20 20 Perché: Lindice i viene fatto incrementare fino a quando si trova un elemento maggiore o uguale al pivot ? ij Quick Sort: Esempio (cont) pivot=90 Lincremento dellindice i non si arresterebbe mai, se non ci fosse la condizione uguale al pivot

21 21 Perché: Lindice j viene fatto decrementare fino a quando si trova un elemento minore o uguale al pivot ? ij Quick Sort: Esempio (cont) pivot=0 Il decremento dellindice j non si arresterebbe mai, se non ci fosse la condizione uguale al pivot

22 22 Codifica C del Quick Sort 1. void QSort (tipobase v[], long inf, long sup) 2. { 3. tipobase pivot=v[(inf+sup)/2]; 4. long i=inf, j=sup; 5. while (i<=j) { 6. while (v[i]pivot) j--; 8. if (i

23 23 Prestazioni del Quick Sort Le prestazioni del Quick Sort dipendono dalla scelta del pivot, ma si dimostra che mediamente le sue prestazioni sono n*logn Ad ogni ricorsione si possono verificare diverse condizioni, che variano da un caso peggiore ad un caso migliore Caso migliore: In una generica ricorsione, il pivot coincide casualmente con il mediano degli elementi contenuti nel vettore. In tal caso, il vettore originario è decomposto in due sottovettori di dimensione uguale. Caso peggiore: In una generica ricorsione, il pivot coincide casualmente con il massimo degli elementi contenuti nel vettore. In tal caso, il vettore originario è decomposto in due sottovettori, di cui il primo ha dimensione uguale alla dimensione originaria meno 1, e laltro ha una dimensione unitaria. Il caso peggiore si verifica anche quando il pivot coincide con lelemento minimo

24 24 Quick Sort: caso migliore Scegliamo come pivot lelemento di indice m = (inf+sup)/2, ovvero v[4]=15; casualmente questo coincide con lelemento mediano m del vettore. L'elemento mediano è quello tale che il numero di elementi del vettore più grandi di lui è circa uguale al numero di elementi del vettore che più piccoli di lui. Il numero di elementi più piccoli di 15 è 4, mentre il numero di elementi più grandi di 15 è ij Si consideri il seguente vettore di n=10 elementi

25 25 Lindice i viene incrementato fino a quando non viene trovato un elemento più grande o uguale al pivot. Nel nostro esempio lindice i si arresta in corrispondenza dellelemento 45. Per quanto riguarda lindice j esso viene spostato fino a quando non si perviene allelemento 15, uguale al pivot ij Gli elementi di indice i e j vengono scambiati, e lindice i viene incrementato, mentre j viene decrementato, ottenendo: ij Quick Sort: caso migliore (cont.)

26 26 Lindice i viene arrestato in quanto esso corrisponde al pivot. Lindice j viene fatto decrementare fino a quando esso perviene allelemento 12, che è inferiore al pivot: ij La prima passata dellalgoritmo QuickSort si conclude, perché i due indici i e j si sono invertiti. Gli elementi i e j vengono scambiati e successivamente i viene incrementato e j viene decrementato, ottenendo: ji Quick Sort: caso migliore (cont.)

27 27 Come si vede alla fine della prima passata di ordinamento risulta che: tutti gli elementi di indice appartenente a inf,..,j sono minori o uguali del pivot tutti gli elementi di indice appartenente a i,..,sup sono maggiori o uguali del pivot non ci sono elementi di indice appartenente a j+1,..,i-1. Come si vede lesempio considerato rappresenta il caso migliore perché il vettore originario è stato decomposto in due vettori che hanno entrambi dimensione uguale e pari a metà della dimensione iniziale. Lalgoritmo procede ricorsivamente operando sui vettori delimitati dagli indici (inf,..,j) e (i,..,sup). Quick Sort: caso migliore (cont.)

28 28 Quick Sort: caso peggiore Se scegliamo come pivot lelemento di indice m=(inf+sup)/2, ovvero v[4]=34, questo casualmente coincide con lelemento maggiore del vettore ij Si consideri il seguente vettore di n=10 elementi:

29 ij Quick Sort: caso peggiore (cont) Lindice i viene incrementato fino a quando non viene trovato un elemento più grande o uguale al pivot. Nel nostro esempio lindice i si arresta in corrispondenza del pivot. Lesempio mette in evidenza il motivo di incrementare lindice i fino a quando si trova un elemento più grande o uguale al pivot. Se non ci fosse la condizione uguale, nel nostro esempio lindice i verrebbe continuamente incrementato oltre la dimensione del vettore. Per quanto riguarda lindice j esso non viene spostato in quanto lelemento j-esimo è inferiore al pivot.

30 30 Gli elementi di indice i e j vengono scambiati, e lindice i viene incrementato, mentre j viene decrementato, ottenendo: ij Quick Sort: caso peggiore (cont) Lindice i viene quindi fatto incrementare fino a quando arriva allelemento 34, che è pari al pivot. Lindice j non viene fatto decrementare perché si riferisce ad un elemento già inferiore al pivot ji

31 31 Siccome i > j, la prima ricorsione è finita: tutti gli elementi di indice appartenente a inf,..,j sono minori o uguali del pivot. Il numero di tali elementi è n-1 vi è un solo elemento di indice i,..,sup (uguale al pivot) non ci sono elementi di indice appartenente a j+1,..,i-1. Lalgoritmo procede quindi ricorsivamente operando SOLO sul vettore delimitati dagli indici (inf,..,j) E chiaro che nella successiva ricorsione, le cose potrebbero cambiare, ma si capisce come la scelta del pivot influenza le prestazioni del QuickSort infji Quick Sort: caso peggiore (cont)


Scaricare ppt "1 Algoritmi di ordinamento Fondamenti di Informatica Prof. Ing. Salvatore Cavalieri."

Presentazioni simili


Annunci Google