Tony Hoare: inventore del Quicksort.

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Tony Hoare: inventore del Quicksort."

Transcript

1 Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Curriculum SR (Sistemi e Reti) Algoritmi e Laboratorio a.a Lezioni prof. Elio Giovannetti Parte 9 Il Quicksort versione 10/01/2007 Quest' opera è pubblicata sotto una Licenza Creative Commons Attribution-NonCommercial-ShareAlike 2.5. Il quicksort: l'algoritmo di ordinamento più usato nel mondo. Tony Hoare: inventore del Quicksort E. Giovannetti - AlgELab Lez

2 Tony Hoare's interest in computing was awakened in the early fifties, when he studied philosophy (together with Latin and Greek) at Oxford University, under the tutelage of John Lucas. He was fascinated by the power of mathematical logic as an explanation of the apparent certainty of mathematical truth. During his National Service ( ), he studied Russian in the Royal Navy. Then he took a qualification in statistics (and incidentally) a course in programming given by Leslie Fox). In 1959, as a graduate student at Moscow State University, he studied the machine translation of languages (together with probability theory, in the school of Kolmogorov). To assist in efficient look-up of words in a dictionary, he discovered the well-known sorting algorithm Quicksort E. Giovannetti - AlgELab Lez.09 3 Il quicksort L'idea. Una possibile definizione induttiva di sequenza ordinata: una sequenza vuota o di un solo elemento è ordinata; una sequenza: u 1, u 2,..., u k, p, v 1, v 2,..., v h tale che: tutti gli u 1, u 2,..., u k sono minori di p; tutti gli v 1, v 2,..., v h sono maggiori o uguali a p; u 1, u 2,..., u k è ordinata; v 1, v 2,..., v k è ordinata; è una sequenza ordinata. Da questa definizione di che cosa è una sequenza ordinata si ricava immediatamente un algoritmo per trasformare una sequenza qualunque in una sequenza ordinata, cioè un algoritmo di ordinamento E. Giovannetti - AlgELab Lez

3 Quicksort: schema astratto dell'algoritmo void qsort(sequenza S) { if (lunghezza di S > 1) { togli un elemento p da S; ripartisci tutti gli altri elementi di S in due parti: una sequenza S1 contenente tutti gli elem. < p; una sequenza S2 contenente tutti gli elem. p; forma la sequenza S1 p S2; qsort(s1); qsort(s2); } } l'elemento p è detto pivot o perno della partizione E. Giovannetti - AlgELab Lez.09 5 Nota Bene Poiché viene "tolto" un elemento dalla (sotto-)sequenza S prima di farne la partizione, la lunghezza di S1 e la lunghezza di S2 sono certamente entrambe minori della lunghezza di S, anche nel caso in cui una delle due parti risulti vuota: lunghezza(s1) < lunghezza(s) lunghezza(s2) < lunghezza(s) Se così non fosse, si potrebbe avere una chiamata ricorsiva su una sottosequenza S1 (o S2) della stessa lunghezza di S e in tal caso la procedura in generale non terminerebbe E. Giovannetti - AlgELab Lez

4 Una versione leggermente diversa Una possibile definizione induttiva di sequenza ordinata: una sequenza vuota o di un solo elemento è ordinata; una sequenza: u 1, u 2,..., u k, v 1, v 2,..., v h tale che: sia p un elemento appartenente alla sequenza; tutti gli u 1, u 2,..., u k sono minori o uguali a p; tutti gli v 1, v 2,..., v h sono maggiori o uguali a p; u 1, u 2,..., u k è ordinata; v 1, v 2,..., v k è ordinata; è una sequenza ordinata. Anche da questa definizione si ricava subito un algoritmo di ordinamento, lievemente diverso dal precedente. A differenza di prima, gli eventuali elementi uguali al pivot non stanno necessariamente tutti da una parte, ma possono trovarsi da entrambi i lati del pivot E. Giovannetti - AlgELab Lez.09 7 Quicksort: schema astratto dell'algoritmo vers. 2 void qsort(sequenza S) { if (lunghezza di S > 1) { scegli un elemento p in S; ripartisci tutti gli elementi di S in due sequenze S1 ed S2 tali che: S1 contenga solo elementi p; S2 contenente solo elem. p; e contemporaneamente forma la sequenza S1 S2; qsort(s1); qsort(s2); } } 0.44 E. Giovannetti - AlgELab Lez

5 Osservazione a differenza che nella prima versione, il pivot non viene "tolto" dalla sequenza prima di effettuare la partizione; pertanto, se una delle due parti S1 o S2 risulta vuota, l'altra è lunga quanto l'intera sequenza S; il procedimento con cui si effettua la partizione deve quindi essere tale da garantire che S1 ed S2 risultino in ogni caso non vuote, e quindi entrambe di lunghezza minore della lunghezza di S E. Giovannetti - AlgELab Lez.09 9 Analisi della complessità: introduzione. La partizione in due o tre (o in un numero fisso di) parti può essere effettuata in tempo lineare sia su liste che su array, e senza usare (nel caso di array) array ausiliari (ricorda la bandiera tricolore). Il tempo T(n) necessario per ordinare una sottosequenza di lunghezza n è quindi (per la seconda versione): n tempo necessario per effettuare la partizione; T(r) tempo necessario per ordinare S1, se r è la lunghezza di S1; T(n r) tempo necessario per ordinare S2, la cui lunghezza è ovviamente n-r (con la prima versione si avrebbe n-1 r invece di n-r) Il tempo T(1) o T(0) necessario per ordinare una porzione di lunghezza 1 o 0 è ovviamente costante (non si deve fare nulla), possiamo assumere che sia uno oppure zero: T(1) = T(0) = 1 oppure T(1) = T(0) = E. Giovannetti - AlgELab Lez

6 Analisi della complessità: equazioni di ricorrenza Abbiamo quindi ottenuto: T(1) = T(0) = 0 (oppure 1) T(n) = n + T(r) + T(n r) dove r può essere un valore distinto per ogni distinta chiamata ricorsiva. caso migliore = partizione sempre bilanciata: ad ogni chiamata ricorsiva, le due parti S1 ed S2 risultano sempre di ugual lunghezza fra di loro: T(n) n + T(n/2) + T(n/2) caso peggiore = partizione sempre sbilanciata al massimo: ad ogni chiamata ricorsiva, le due parti S1 ed S2 risultano sempre una di lunghezza 1 e l'altra di lunghezza n-1: T(n) n + T(n 1) + T(1) 0.44 E. Giovannetti - AlgELab Lez cioè: Caso migliore T(1) = 1 T(n) = n + T(n/2) + T(n/2) T(1) = 1 T(n) = 2T(n/2) + n è la stessa equazione del mergesort, studiata nel corso di Programmazione 2, con soluzione: T(n) = Θ(n log n) Come avevamo fatto a trovare la soluzione? (Ri)vediamolo nelle slides seguenti E. Giovannetti - AlgELab Lez

7 Caso migliore: rappresentazione grafica delle eq. di ricorrenza T(1) = 1 T(n) = n T(n/2) T(n/2) 0.44 E. Giovannetti - AlgELab Lez T(n) = n per semplicità sia n = 2 k T(n/2) T(n/2) 0.44 E. Giovannetti - AlgELab Lez

8 T(n) = n per semplicità sia n = 2 k n/2 n/2 T(n/4) T(n/4) T(n/4) T(n/4) 0.44 E. Giovannetti - AlgELab Lez T(n) = n per semplicità sia n = 2 k n/2 n/2 n/4 n/4 n/4 n/4 T(n/8) T(n/8) T(n/8) T(n/8) T(n/8) T(n/8) T(n/8) T(n/8) 0.44 E. Giovannetti - AlgELab Lez

9 livello 0 T(n) = n per semplicità sia n = 2 k 1 n/2 n/2 2 n/4 n/4 n/4 n/4 3 n/8 n/8 n/8 n/8 n/8 n/8 n/8 n/8 livello k T(1) T(1) T(1) T(1) T(1) 0.44 E. Giovannetti - AlgELab Lez livello 0 T(n) = n per semplicità sia n = 2 k 1 somma del livello: n/2 2 1 (n/2 1 ) = n n/2 2 n/4 n/4 2 2 (n/2 2 ) = n n/4 n/4 3 n/8 n/8 2 3 (n/2 3 ) = n n/8 n/8 n/8 n/8 n/8 n/8 livello k E. Giovannetti - AlgELab Lez

10 Abbiamo posto n = 2 k, quindi k = log 2 n. L'albero ha k+1 livelli, da 0 a k; per ciascun livello il tempo complessivo è n. Quindi: T best (n) = (k+1) n = n(1+log 2 n) = Θ(n log n) Assumendo T(1) = 0 invece di T(1) = 1 otteniamo 0 sull'ultimo livello, e quindi: T best (n) = k n = n log 2 n = Θ(n log n) 0.44 E. Giovannetti - AlgELab Lez livello 0 T(n) = n per semplicità sia n = 2 k 1 somma del livello: n/2 2 1 (n/2 1 ) = n n/2 2 n/4 n/4 2 2 (n/2 2 ) = n n/4 n/4 3 n/8 n/8 2 3 (n/2 3 ) = n n/8 n/8 n/8 n/8 n/8 n/8 livello k E. Giovannetti - AlgELab Lez

11 L'albero disegnato nelle slides precedente è l'albero delle chiamate ricorsive, o albero di ricorsione. In esso si vede bene che i due fattori dell'espressione della complessità temporale hanno i seguenti significati: log 2 n è il numero di livelli di ricorsione, cioè il massimo numero di chiamate ricorsive "annidate"; n, numero degli elementi, è il tempo impiegato nel partizionamento complessivamente da tutte le chiamate di uno stesso livello di ricorsione. Nota Bene: Nel quicksort tutto il lavoro dell'algoritmo viene effettuato dal partizionamento, così come nel mergesort veniva effettuato dalla fusione E. Giovannetti - AlgELab Lez Caso migliore: traduciamo il disegno in scrittura. cioè: T(1) = 1 T(n) = n + T(n/2) + T(n/2) T(1) = 1 T(n) = 2T(n/2) + n La seconda equazione vale per qualunque n > 1, allora riscriviamola con n/2 al posto di n (assumendo che n/2 > 1): T(n/2 n/2) ) = 2T((n/2) (n/2)/2) + n/2 cioè T(n/2) = 2T(n/2 2 ) + n/2 Ora per mezzo di essa espandiamo l'equazione originale: T(n) = 2T(n/2) 2 + n = 2( 2T(n/2 2 ) + n/2) ) + n = cioè T(n) = 2 2 T(n/2 2 ) + n + n = 2 2 T(n/2 2 ) + 2n 0.44 E. Giovannetti - AlgELab Lez

12 Continuiamo ad espandere: T(n/2 2 ) = 2T(n/2 3 ) + n/2 2 T(n) = 2 2 T(n/2 2 ) + 2n = 2 2 (2T(n/2 3 ) + n/2 2 ) + 2n = 2 3 T(n/2 3 ) + n + 2n = 2 3 T(n/2 3 ) + 3n... dopo h passi: T(n) = 2 h T(n/2 h ) + hn; se n = 2 k, si ha: T(n) = 2 k T(1) + kn se T(1) = 0 T(n) = nk = n log 2 n 0.44 E. Giovannetti - AlgELab Lez Caso migliore: complessità in spazio. Il quicksort opera la partizione "sul posto", cioè senza bisogno di un array aggiuntivo di lunghezza n (o dipendente da n). Tuttavia, essendo un algoritmo inerentemente ricorsivo, ha bisogno dello spazio per lo stack dei frames relativi alle chiamate ricorsive. Come abbiamo visto, l'altezza dell'albero di ricorsione è la massima profondità di chiamate ricorsive annidate, ed è quindi (proporzionale a) la massima profondità dello stack. Quindi: S best (n) = Θ(log n) 0.44 E. Giovannetti - AlgELab Lez

13 Caso peggiore T(1) = 0 T(n) = n + T(n 1) T(1) = 0 T(n) = n T(n-1) 0.44 E. Giovannetti - AlgELab Lez Espandendo, come nel caso migliore: T(n-1) = n-1 T(n) = n n-1 T(n-2) T(n-2) 0.44 E. Giovannetti - AlgELab Lez

14 Espandendo di nuovo: T(n-2) = n-2 T(n) = n T(n-3) n-1 n-2 T(n-3) 0.44 E. Giovannetti - AlgELab Lez Continuando a espandere: T(n) = n L'albero di ricorsione degenera in una sequenza. T(n) = n + (n 1) + (n 2) = n(n+1)/2 1 = (n 2 + n)/2 1 n-1 n-2 2 T(n) = Θ(n 2 ) T(1) 0.44 E. Giovannetti - AlgELab Lez

15 Caso peggiore: traducendo il disegno in scrittura T(1) = 0 T(n) = n + T(n 1) + T(1) = n + T(n 1) espandiamo: T(n) = n + T(n 1) = = n + (n 1) + T(n 2) = = n + (n 1) + (n 2) + T(n 3) = = n + (n 1) + (n 2) + (n 3) T(1) = = n + (n 1) + (n 2) = = n(n+1)/2 1 T(n) = Θ(n 2 ) 0.44 E. Giovannetti - AlgELab Lez Caso peggiore: nota. Assumendo T(1) = 1 invece di T(1) = 0 il risultato non cambia: T(n) = n T(n 1) T(n) = n (n + T(n 2)) = = (n + 1) + n + (n 1) + T(n 3) = =... = (n + 1) + n + (n 1) = = Θ(n 2 ) 0.44 E. Giovannetti - AlgELab Lez

16 Caso peggiore: complessità in spazio. L'albero di ricorsione degenera in una sequenza di lunghezza n. Perciò: la profondità massima dello stack è (proporzionale a) n. S worst (n) = Θ(n) 0.44 E. Giovannetti - AlgELab Lez Caso peggiore: osservazione. Consideriamo il caso in cui il partizionamento produca sempre due parti di lunghezze k ed n-k, con k fisso; cioè due parti di cui una sempre di lunghezza k (assumiamo che le chiamate ricorsive su porzioni di lunghezza h k producano due parti di lunghezze h-1 e 1). È abbastanza facile vedere che anche in questo caso il comportamento asintotico di T(n) è lo stesso che nel caso peggiore (quadratico). Si ha infatti: T(k) c k 2 = C T(n) = n + T(k) + T(n-k) = n + C + T(n-k) Espandendo nel solito modo si ottiene: 0.44 E. Giovannetti - AlgELab Lez

17 n n-k C L'albero di ricorsione degenera in una quasi-lista di lunghezza proporzionale a n: n/k n-2k C n-3k C E. Giovannetti - AlgELab Lez Caso medio: intuizione In generale la partizione quasi mai sarà perfettamente bilanciata, ma anche quasi mai totalmente sbilanciata. Mediamente ognuna delle due parti della partizione avrà una lunghezza "non troppo lontana" da n/2; possiamo quindi intuire, in modo un po'vago, che il caso medio sia simile al caso migliore. Un esempio abbastanza istruttivo: assumiamo che il partizionamento produca sempre una partizione di 9 a 1 (cioè in cui le due parti siano sempre rispettivamente 1/10 e 9/10 della sequenza da ripartire). È questo un caso che si comporta come il caso peggiore? La risposta nelle prossime slides E. Giovannetti - AlgELab Lez

18 T(n) = Un esempio n Espandiamo l'albero come nei casi precedenti E. Giovannetti - AlgELab Lez Riscrivendo con (1/10)n al posto di n: = 0.44 E. Giovannetti - AlgELab Lez

19 Riscrivendo con (9/10)n al posto di n: = 0.44 E. Giovannetti - AlgELab Lez n 0.44 E. Giovannetti - AlgELab Lez

20 n n 10 h n (10/9) k log 10 n somma del livello: n n n log 10/9 n... livello h n livello k E. Giovannetti - AlgELab Lez Esempio: conclusione n log 10 n T(n) n n log 10/9 quindi T(n) = Θ(n log n) 10/9 n Un partizionamento che produca una partizione sempre sbilanciata di 9 a 1 si comporta asintoticamente come un partizionamente sempre perfettamente bilanciato! Il ragionamento si può ripetere invariato per partizionamento di 99 a 1, 999 a 1, ecc. Insomma ogni partizionamento che produca una ripartizione in una proporzione fissa in tutte le chiamate ricorsive determina un comportamento del quicksort asintoticamente uguale a quello del caso migliore! Ciò rafforza la nostra intuizione che il caso medio si comporti come il caso migliore... Dimostrazione rigorosa in lez E. Giovannetti - AlgELab Lez

21 Riassumendo: T worst (n) = Θ(n 2 ) T best (n) = Θ(n log n T medio (n) =Θ(n log n in place log n) log n) S worst (n) S best (n) S medio (n) = Θ(n) = Θ(log n) n =Θ(log n) n non stabile, perché basato su scambi. (vedremo che la complessità spaziale del caso peggiore e del caso migliore può essere diminuita con un'opportuna ottimizzazione) E. Giovannetti - AlgELab Lez Quicksort L'algoritmo concreto: differenti versioni E. Giovannetti - AlgELab Lez

22 Quicksort su array, versione 1 ("togliendo" il pivot): schema. sia a[inf..sup] la porzione di array da ordinare, con inf< sup: tolgo da essa un elemento, ad esempio il primo; partiziono il resto in due parti: < x e x inf x j < x x sup inserisco x fra le due parti, "spostando indietro di uno" la parte < x, cioè: scambia a[inf] con a[j] inf j x sup ordina a[inf..j-1]; ordina a[j+1..sup] 0.44 E. Giovannetti - AlgELab Lez Il partizionamento inf+1 a: j < x x i sup INVARIANTE a[inf+1.. j] < x a[j+1.. i-1] x i sup+1 j < i Corpo del ciclo (mantiene l'invariante) if(a[i] < x) { j++; scambia(a,i,j); // scambia a[i] con a[j] } i++; Inizializzazione (stabilisce l'invariante) la parte a[inf inf+1.. j] è vuota: j = inf; la parte a[j+1.. i-1] i è vuota: i = inf+1; 0.44 E. Giovannetti - AlgELab Lez

23 L'inserimento del pivot Test C'è ancora qualche elemento da esaminare: while(i sup) Quindi all'uscita dal ciclo è i > sup, quindi i = sup+1 inf j x < x x sup i Ora dobbiamo inserire il pivot fra le due porzioni. Attenzione: potremmo scambiarlo con a[j+1], cioè con il primo dei "gialli"? No, perché in tal modo in a[inf] ci andrebbe un elemento "giallo"; invece a[inf.. j-1] deve essere tutto "dell'altro colore" (cioè < x). Il pivot deve dunque essere scambiato con a[j], come indicato nella slide E. Giovannetti - AlgELab Lez Il partizionamento (continua) Test Osservazione Il ciclo può essere realizzato convenientemente con un for: int x = a[inf]; prende il primo elem. come pivot int j = inf; for(int i = inf+1; i <= sup; i++) { if(a[i] < x) { j++; scambia(a,i,j); } } inserisce il pivot fra le due parti scambia(a,inf,j); "spostando" la prima parte 0.44 E. Giovannetti - AlgELab Lez

24 Attenzione, come al solito, agl'indici! se il ciclo è fatto in modo tale che, all'uscita, j indichi il primo dei maggiori/uguali invece dell'ultimo dei minori: inf x j < x x sup per inserire x, attenzione: scambia a[inf] con a[j-1] inf j-1 x sup ordina a[inf..j-2]; ordina a[j..sup] 0.44 E. Giovannetti - AlgELab Lez Domande Cambia qualcosa se il test è a[i]<=x invece di a[i]<x, cioè se la partizione è fra minori-o-uguali e maggiori invece che fra minori e maggiori-o-uguali? Si realizzi una variante del quicksort del tutto analoga alle precedenti ma che prenda come pivot l'ultimo elemento invece del primo. Qual è o quali sono i casi peggiori nelle realizzazioni precedenti? 0.44 E. Giovannetti - AlgELab Lez

25 Una variante Come sappiamo dal problema della bandiera tricolore, il partizionamento può essere effettuato tenendo la parte da esaminare "in mezzo" invece che in fondo: a: x inf+1 i j < x x sup INVARIANTE a[inf inf+1.. i-1] i < x a[i+1.. sup] x i j+1 j > inf i sup Corpo del ciclo (mantiene l'invariante) if(a[i] < x) i++; else { scambia a[i] con a[j] j--; } 0.44 E. Giovannetti - AlgELab Lez a: x inf+1 i j < x x sup Inizializzazione (stabilisce l'invariante) la parte a[inf inf+1.. i-1] i è vuota: i = inf+1; la parte a[j+1.. sup] è vuota: j = sup; Test C'è ancora qualche elemento da esaminare: i j All'uscita dal ciclo vale quindi l'uguaglianza i = j+1: inf j i x < x x sup 0.44 E. Giovannetti - AlgELab Lez

26 Fine della variante. Come nella versione precedente: inf j i x < x x sup inserisco x fra le due parti, "spostando indietro di uno" la parte < x, cioè: scambia a[inf] con a[j] inf j x sup 0.44 E. Giovannetti - AlgELab Lez Quicksort: "randomizzazione". Nelle versioni precedenti il caso peggiore si verifica quando, ad ogni chiamata ricorsiva, gli elementi della porzione di array considerata sono o tutti minori o tutti maggiori/uguali del pivot. Ciò accade se l'array è già ordinato oppure ordinato al contrario: il che è molto spiacevole! Una buona soluzione consiste nello scegliere ogni volta il pivot a caso: in questo modo nessuna particolare istanza di input si comporta sempre da caso peggiore; l'utilizzatore "maligno" può produrre apposta un caso peggiore soltanto conoscendo l'algoritmo usato per la generazione dei numeri pseudo-casuali E. Giovannetti - AlgELab Lez

27 Generazione di un indice casuale. Vedere nella documentazione delle API la documentazione relativa alla classe Random. Fuori della procedura ricorsiva: Random generatore = new Random(); Nella procedura ricorsiva, per generare un naturale pseudo-casuale nel range [inf.. sup]: int ipivot = inf + generatore.nextint(sup - inf + 1); Si scambia l'elemento-pivot con il primo (o con l'ultimo) e ci si riporta così alla situazione di una delle realizzazioni precedenti, che viene pertanto seguita senza variazioni E. Giovannetti - AlgELab Lez Il pivot scelto come mediana di un certo numero di elementi Il verificarsi del caso peggiore quando l'array è ordinato (o ordinato al contrario) può essere evitato anche senza ricorrere alla randomizzazione: basta scegliere un elemento diverso dal primo e dall'ultimo. Osserva: la partizione è perfettamente bilanciata se il pivot è la mediana della sequenza da partizionare (vedi definizione di mediana nel corso di Probabilità). Non sapendo qual è la vera mediana, si può scegliere come pivot il mediano di un certo numero di elementi: ad es. il mediano di primo, ultimo, ed elemento centrale; oppure il mediano di nove elementi presi ad intervalli regolari. In questo modo il caso peggiore non è più l'array ordinato, ma è comunque una fissata configurazione dell'array, che si comporta sempre da caso peggiore E. Giovannetti - AlgELab Lez

28 Richiamo di Probabilità e Statistica. La mediana di un insieme di valori è un valore (appartenente all'insieme) che "bipartisce" l'insieme; cioè è un valore (appartenente all'insieme) tale che metà degli elementi dell'insieme sono minori o uguali ad esso, e l'altra metà sono maggiori o uguali. La mediana è spesso una nozione statistica più significativa di quella di media: su un campione di 11 persone, di cui 5 guadagnano 2000 euro al mese, 5 guadagnano 3000 euro al mese, e uno guadagna euro al mese: la media è circa 11364, la mediana è La ricchezza media di coloro che hanno pubblicato un articolo scientifico sul quicksort è significativamente più alta di quella dei ricercatori in altri campi, la mediana non lo è (fra gli autori di un articolo sul quicksort vi è un certo William Gates, su Discrete Mathematics, 1979) E. Giovannetti - AlgELab Lez Combinazione dei due meccanismi precedenti. Si può scegliere il mediano di un certo numero di elementi di cui almeno alcuni scelti a caso. Ad esempio, il mediano di tre elementi: primo, ultimo, e un elemento di indice scelto a caso (escludendo primo e ultimo) E. Giovannetti - AlgELab Lez

29 Nota Nelle versioni precedenti alcuni elementi possono essere spostati due volte; ad esempio, se la parte da esaminare è "in mezzo": a: x inf+1 i < x x x x j sup Se a[i] ed a[j] sono entrambi x, il contenuto di a[j] viene prima spostato "a sinistra" (nello scambio con a[i]) e poi al passo successivo riportato "a destra". L'algoritmo mette al posto giusto un solo elemento alla volta (eventualmente spostandone un altro dalla parte sbagliata) E. Giovannetti - AlgELab Lez Quicksort: il problema degli elementi uguali al pivot Nelle versioni viste finora, se nel partizionamento vi sono molti elementi uguali al pivot (anche se scelto a caso) essi finiscono tutti "da una stessa parte", producendo così uno sbilanciamento. Un array di elementi tutti uguali, o quasi tutti uguali, costituirà quindi un caso peggiore, di complessità quadratica, anche con pivot scelto a caso. Per ovviare a tale inconveniente si può adottare una delle seguenti due strategie: originale di Hoare: fare in modo che gli elementi uguali al pivot possano stare da entrambe le parti (non del tutto facile una realizzazione corretta; vedi lez 9.3); tri-partizione: effettuare (adottando l'algoritmo della bandiera) una partizione in tre: minori, uguali, maggiori; le chiamate ricorsive vengono poi eseguite soltanto sulle due parti risp. dei minori e dei maggiori del pivot E. Giovannetti - AlgELab Lez

30 Vantaggi della tripartizione Poiché di elementi uguali al pivot ne esiste almeno uno, cioè il pivot stesso, le altre due parti della partizione sono entrambe sicuramente più corte della porzione partizionata. Poiché le chiamate ricorsive vengono fatte solo sulle parti consistenti di elementi diversi dal pivot, su un array di elementi tutti uguali non viene effettuata nessuna chiamata ricorsiva! Un array di elementi uguali costituisce quindi un molto particolare caso migliore di complessità temporale lineare (il tempo è infatti solo quello necessario alla partizione dell'intero array) e spaziale costante (la profondità dello stack non aumenta con n, bensì è costante): T best best (n) = Θ(n) S best best (n) = Θ(1) 0.44 E. Giovannetti - AlgELab Lez Svantaggi della tripartizione e rimedi. Il test è più complesso e quindi più dispendioso in tempo. Tenere gli elementi uguali al pivot "in mezzo" costringe ad effettuare uno scambio per ogni elemento diverso dal pivot; ma il caso "diverso dal pivot" si presume sia il caso più frequente: quindi si ha maggiore dispendio di tempo. Un rimedio al difetto precedente può essere tentato posizionando la parte degli uguali al pivot a sinistra o a destra invece che in mezzo, spostandola poi in mezzo solo alla fine del partizionamento. Oppure combinando la tripartizione con alcuni aspetti della versione "alla Hoare", come nella versione di Bentley-McIllRoy E. Giovannetti - AlgELab Lez

31 Confronto fra algoritmi e questioni di costanti. Il quicksort è asintoticamente molto più efficiente di algoritmi di ordinamento quadratici come l'insertion sort. Tuttavia la sequenza di operazioni che esso esegue per ciascun elemento dell'array è più complessa e quindi più dispendiosa in tempo. In termini matematici: se i tempi del caso medio rispettiv. per il quicksort e per l'insertion-sort sono T q medio(n) C q n log n + C q 'n + C q '' T i medio(n) C i n 2 + C i 'n + C i '' allora si ha C q > C i, ecc. Per piccoli valori di n (alcune decine) un algoritmo quadratico ma semplice, come l'insertion sort, è più efficiente di un algoritmo pseudolineare ma più complesso, come il quicksort E. Giovannetti - AlgELab Lez Grafici Per n < n 0 è più efficiente l'insertion sort. Si tratta di determinare sperimentalmente n 0. T isort T qsort g(n) n 0 n 0.44 E. Giovannetti - AlgELab Lez

32 Raffinamento del quicksort tramite l'insertion sort. Si confrontano sperimentalmente i tempi di calcolo del quicksort e dell'insertion sort, e si determina in modo approssimato il valore di n 0. All'interno della procedura del quicksort, quando la lunghezza della porzione da ordinare è inferiore a n 0 si esegue l'algoritmo di insertion-sort. In tal modo quando nelle successive chiamate ricorsive si scende sotto la lunghezza critica, l'algoritmo richiama l'insertion sort invece di continuare la ricorsione E. Giovannetti - AlgELab Lez Nota finale Attenzione: è facile sbagliare l'implementazione del quicksort! It is very easy to make errors when programming Quicksort. The basic idea is simple but the details of the manipulation of the "pointers" hi, lo, left, right, are very easily messed up - this is the voice of bitter experience! LLoyd Allison, Monash University 0.44 E. Giovannetti - AlgELab Lez

Algoritmi e Laboratorio a.a Lezioni. prof. Elio Giovannetti

Algoritmi e Laboratorio a.a Lezioni. prof. Elio Giovannetti Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Curriculum SR (Sistemi e Reti) Algoritmi e Laboratorio a.a. 2005-06 Lezioni prof. Elio Giovannetti Parte 7 Algoritmi di ordinamento

Dettagli

Programmazione I - corso B a.a prof. Viviana Bono

Programmazione I - corso B a.a prof. Viviana Bono Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a. 2009-10 prof. Viviana Bono Blocco 15 Algoritmi su array: selection sort, insertion sort, fusione

Dettagli

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Curriculum SR (Sistemi e Reti) Algoritmi e Laboratorio a.a.

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Curriculum SR (Sistemi e Reti) Algoritmi e Laboratorio a.a. Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Curriculum SR (Sistemi e Reti) Algoritmi e Laboratorio a.a. 2009-10 Lezioni prof. Elio Giovannetti Lezione 7 Il problema della

Dettagli

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano. Usa la tecnica del divide et impera:

Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano. Usa la tecnica del divide et impera: MergeSort Usa la tecnica del divide et impera: 1 Divide: dividi l array a metà 2 Risolvi i due sottoproblemi ricorsivamente 3 Impera: fondi le due sottosequenze ordinate 1 Esempio di esecuzione 7 2 4 5

Dettagli

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento: Selection e Insertion Sort

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati Capitolo 4 Ordinamento: Selection e Insertion Sort Ordinamento Dato un insieme S di n elementi presi da un dominio totalmente ordinato, ordinare S in ordine non crescente o non

Dettagli

Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

Algoritmo di ordinamento sul posto che ha tempo di esecuzione : QuickSort Algoritmo di ordinamento sul posto che ha tempo di esecuzione : - O(n 2 ) nel caso peggiore - O(n log n) nel caso medio Nonostante le cattive prestazioni nel caso peggiore, rimane il miglior

Dettagli

Albero di Riscorsione

Albero di Riscorsione Albero di Riscorsione Albero di ricorsione Un albero di ricorsione è un modo di visualizzare cosa accade in un algoritmo divide et impera L etichetta della radice rappresenta il costo non ricorsivo della

Dettagli

Calcolare x n = x x x (n volte)

Calcolare x n = x x x (n volte) Calcolare x n = x x x (n volte) Abbiamo bisogno di: una variabile ris in cui ad ogni iterazione del ciclo si ha un risultato parziale, e che dopo l ultima iterazione contiene il risultato finale; una variabile

Dettagli

Quick Sort. PARTITION(A,p,r) risistema il sottoarray A[p...r] e riporta l indice q:

Quick Sort. PARTITION(A,p,r) risistema il sottoarray A[p...r] e riporta l indice q: Quick Sort - Ordinamento in loco - Tempo di esecuzione nel caso peggiore: Θ(n 2 ) - Tempo di esecuzione nel caso medio: Θ(n lg n) - I fattori costanti nascosti nella notazione Θ sono abbastanza piccoli

Dettagli

Per regnare occorre tenere divisi i nemici e trarne vantaggio. fai ad ogni passo la scelta più conveniente

Per regnare occorre tenere divisi i nemici e trarne vantaggio. fai ad ogni passo la scelta più conveniente Progetto di algoritmi sequenziali (un solo esecutore ) Divide et Impera Per regnare occorre tenere divisi i nemici e trarne vantaggio Greedy fai ad ogni passo la scelta più conveniente Buoni risultati

Dettagli

Gli algoritmi ricorsivi di ordinamento. Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino

Gli algoritmi ricorsivi di ordinamento. Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino ordinamento Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino Merge Sort Ricorsivo, divide et impera Stabile Divisione: due sottovettori SX e DX rispetto al centro del vettore. p r A.A.

Dettagli

Schema generale di un algoritmo divide-et-impera. Algoritmi e Laboratorio a.a Lezioni. Esempio: mergesort su array. Esempio: quicksort

Schema generale di un algoritmo divide-et-impera. Algoritmi e Laboratorio a.a Lezioni. Esempio: mergesort su array. Esempio: quicksort Schema generale di un algoritmo divide-et-impera Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Curriculum SR (Sistemi e Reti) Algoritmi e Laboratorio a.a. 2006-07 Lezioni prof.

Dettagli

QUICKSORT. Basato sul paradigma divide-et-impera (come MERGE-SORT)

QUICKSORT. Basato sul paradigma divide-et-impera (come MERGE-SORT) QUICKSORT Basato sul paradigma divide-et-impera (come MERGE-SORT) Divide: stabilisce un valore di q tale da dividere l array A[p.. r] in due sottoarray non vuoti A[p.. q] e A[q+1.. r], dove ogni elemento

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Algoritmi e Strutture Dati Capitolo 4 Ordinamento: Quicksort (*) e metodi di ordinamento lineari Punto della situazione Problema dell ordinamento: Lower bound (n log n) Upper bound O(n log n) Algoritmi

Dettagli

Esercitazione 2. Quicksort

Esercitazione 2. Quicksort Esercitazione 2 Quicksort Caratteristiche Algoritmo di ordinamento mediamente molto efficiente Vantaggio: ordinamento sul posto Basato sul paradigma divide et impera (come merge sort) Elemento chiave:

Dettagli

Algoritmi di ordinamento: Array e ricorsione

Algoritmi di ordinamento: Array e ricorsione Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ 1 Algoritmi di ordinamento: Array e ricorsione 2 1 Indice Algoritmi di ordinamento: Insertion

Dettagli

I numeri rossi sulla Mole Antonelliana a Natale. Algoritmi e Laboratorio a.a Lezioni. Le regole della riproduzione dei conigli.

I numeri rossi sulla Mole Antonelliana a Natale. Algoritmi e Laboratorio a.a Lezioni. Le regole della riproduzione dei conigli. I numeri rossi sulla Mole Antonelliana a Natale Università di Torino acoltà di Scienze MN Corso di Studi in Informatica Curriculum SR (Sistemi e Reti) Algoritmi e Laboratorio a.a. 29- Lezioni prof. Elio

Dettagli

Si può fare di meglio?

Si può fare di meglio? Si può fare di meglio? Gli algoritmi visti fino ad ora hanno costo O(n 2 ) È possibile fare di meglio? Quanto meglio? Algoritmi e Strutture Dati 1 Algoritmi divide et impera Idea generale Divide: Scomporre

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Algoritmi e Strutture Dati Capitolo 4 Ordinamento: Quicksort (*) e metodi di ordinamento lineari Punto della situazione Problema dell ordinamento: Lower bound (n log n) Upper bound O(n log n) Algoritmi

Dettagli

Sommario. Ordinamento. Selection Sort Bubble Sort/ Shaker Sort Shell Sort

Sommario. Ordinamento. Selection Sort Bubble Sort/ Shaker Sort Shell Sort Ordinamento Sommario Ordinamento Selection Sort Bubble Sort/ Shaker Sort Shell Sort Cosa e' l'ordinamento Il problema consiste nell elaborare insiemi di dati costituiti da record I record hanno sono costituiti

Dettagli

In questa lezione. Il Mergesort: primo esempio di applicazione della tecnica divide et impera analisi tempo di esecuzione del Mergesort

In questa lezione. Il Mergesort: primo esempio di applicazione della tecnica divide et impera analisi tempo di esecuzione del Mergesort In questa lezione Il Mergesort: primo esempio di applicazione della tecnica divide et impera analisi tempo di esecuzione del Mergesort [CLRS] par. 2.3. Prof. E. Fachini - Intr. Alg.!1 Progettazione di

Dettagli

Algoritmi di Ordinamento

Algoritmi di Ordinamento Algoritmi di Ordinamento 1 Algoritmi di ordinamento Selection Sort Quick Sort Lower bound alla complessità degli algoritmi di ordinamento Statistiche di ordine 2 Selection Sort SelectionSort(dati[]) {

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Algoritmi di Ordinamento Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino 13 novembre 2008 Il problema dell ordinamento Il problema dell ordinamento

Dettagli

Analisi algoritmi ricorsivi e relazioni di ricorrenza

Analisi algoritmi ricorsivi e relazioni di ricorrenza Analisi algoritmi ricorsivi e relazioni di ricorrenza Punto della situazione Finora abbiamo affrontato: il tempo di esecuzione di un algoritmo, l analisi asintotica con le notazioni asintotiche e la tecnica

Dettagli

Fondamenti di Informatica

Fondamenti di Informatica Algoritmi di ordinamento Gli ordinamenti interni sono fatti su sequenze in memoria centrale Fondamenti di Informatica 18. Algoritmi di ordinamento in C++ Gli ordinamenti esterni sono fatti su sequenze

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Algoritmi di Ordinamento Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino Il problema dell ordinamento Il problema dell ordinamento di un insieme

Dettagli

Progetto Corda. Alberto Ferrari. Alberto Ferrari Ingegneria dell'informazione, UniPR. 18/12/2017 Progetto Corda

Progetto Corda. Alberto Ferrari. Alberto Ferrari Ingegneria dell'informazione, UniPR. 18/12/2017 Progetto Corda Progetto Corda Alberto Ferrari Alberto Ferrari Ingegneria dell'informazione, UniPR file:///e:/cordanoweb/lez/array.html#3 1/33 Array (ordinamento) 2/33 file:///e:/cordanoweb/lez/array.html#3 2/33 Sort

Dettagli

Nozioni di base (II Parte)

Nozioni di base (II Parte) Nozioni di base (II Parte) 1 Ricorsione [GTG14, Par. 5.1-5.4 and 13.1] Algoritmo Ricorsivo: algoritmo che invoca se stesso (su istanze sempre più piccole) sfruttando la nozione di induzione. La soluzione

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Algoritmi e Strutture Dati Modelli di calcolo e metodologie di analisi Domenico Fabio Savo 1 Notazione asintotica f(n) = tempo di esecuzione / occupazione di memoria di un algoritmo su input di dimensione

Dettagli

come segue: data una collezione C di elementi e una un elemento che verifica la proprietà P

come segue: data una collezione C di elementi e una un elemento che verifica la proprietà P Problemi di Ricerca Carla Binucci e Walter Didimo Il problema della Ricerca In generale, il Problema della Ricerca è definito come segue: data una collezione C di elementi e una proprietà P, determinare

Dettagli

Esercizi per il corso di Algoritmi, anno accademico 2011/12

Esercizi per il corso di Algoritmi, anno accademico 2011/12 Esercizi per il corso di Algoritmi, anno accademico 2011/12 Esercizi sulla Tecnica Divide et Impera N.B. Tutti gli algoritmi vanno scritti in pseudocodice (non in Java, nè in C++, etc. ). Di tutti gli

Dettagli

Sommario. Algoritmi di ordinamento lineari: CountingSort. BucketSort. RadixSort

Sommario. Algoritmi di ordinamento lineari: CountingSort. BucketSort. RadixSort Sommario Algoritmi di ordinamento lineari:! CountingSort! BucketSort! RadixSort 1 Ordinamento in tempo lineare. Il limite inferiore Ω(n log n) vale per tutti gli algoritmi di ordinamento generali, nel

Dettagli

Laboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze Informatiche - Cesena A.A

Laboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze Informatiche - Cesena A.A Ingegneria e Scienze Informatiche - Cesena A.A. 2014-2015 pietro.dilena@unibo.it MergeSort MergeSort MergeSort: esempio MergeSort: pseudocodice Algoritmo di ordinamento ricorsivo basato sulla tecnica Divide

Dettagli

QuickSort (1962, The Computer Journal)

QuickSort (1962, The Computer Journal) QuickSort (1962, The Computer Journal) Charles Antony Richard Hoare (1934 -) Attualmente senior researcher al Microsoft Research Center di Cambridge Hoare ha vinto nel 1980 il Turing Award, il premio più

Dettagli

COMPLESSITÀ COMPUTAZIONALE. Fondamenti di Informatica A - Massimo Bertozzi

COMPLESSITÀ COMPUTAZIONALE. Fondamenti di Informatica A - Massimo Bertozzi COMPLESSITÀ COMPUTAZIONALE Tipi di complessità Consideriamo l'analisi della complessità di un programma da due punti di vista: spazio tempo Complessità Spaziale Lo spazio utilizzato da un programma può

Dettagli

COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI

COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI COMPLESSITÀ COMPUTAZIONALE DEGLI ALGORITMI Fondamenti di Informatica a.a.200.2005/06 Prof. V.L. Plantamura Dott.ssa A. Angelini Ω (grande omega) Diciamo che T(n) = Ω (f(n)), - leggiamo T(n) ha complessità

Dettagli

Ordinamento per inserzione e per fusione

Ordinamento per inserzione e per fusione Ordinamento per inserzione e per fusione Alessio Orlandi 15 marzo 2010 Fusione: problema Problema Siano A e B due array di n A e n B interi rispettivamente. Si supponga che A e B siano ordinati in modo

Dettagli

ORDINAMENTO DI UN GRANDE NUMERO DI OGGETTI

ORDINAMENTO DI UN GRANDE NUMERO DI OGGETTI ORDINAMENTO DI UN GRANDE NUMERO DI OGGETTI L entropia era già molta ma... il risultato finale sarà irreversibile a dispetto di qualsivoglia ALGORITMO DI ORDINAMENTO SELECTION SORT INSERTION SORT MERGE

Dettagli

Analisi di algoritmi e di problemi

Analisi di algoritmi e di problemi Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Curriculum SR (Sistemi e Reti) Algoritmi e Laboratorio a.a. 2006-07 Lezioni prof. Elio Giovannetti Analisi di algoritmi e di problemi

Dettagli

ESERCITAZIONI DI INTRODUZIONE AGLI ALGORITMI (A.A. 08/09)

ESERCITAZIONI DI INTRODUZIONE AGLI ALGORITMI (A.A. 08/09) ESERCITAZIONI DI INTRODUZIONE AGLI ALGORITMI (A.A. 08/09) DISPENSA N. 4 1. Ricerca Binaria Ricorsiva L algoritmo Ricerca Binaria risolve il problema della ricerca di una chiave in un vettore. È un esempio

Dettagli

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet   francesc Algoritmi e Strutture di Dati I 1 Algoritmi e Strutture di Dati I Massimo Franceschet http://www.sci.unich.it/ francesc m.franceschet@unich.it Algoritmi e Strutture di Dati I 2 Problema dell ordinamento

Dettagli

ALGORITMI DI ORDINAMENTO E RICERCA BINARIA. Docente: Giorgio Giacinto AA 2008/2009. problema dell ordinamento in modi diversi

ALGORITMI DI ORDINAMENTO E RICERCA BINARIA. Docente: Giorgio Giacinto AA 2008/2009. problema dell ordinamento in modi diversi Università degli Studi di Cagliari Corso di Laurea Specialistica in Ingegneria per l Ambiente ed il Territorio Corso di Laurea Specialistica in Ingegneria Civile - Strutture FONDAMENTI DI INFORMATICA 2

Dettagli

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento

Algoritmi e Strutture Dati. Capitolo 4 Ordinamento Algoritmi e Strutture Dati Capitolo 4 Ordinamento Ordinamento Dato un insieme S di n oggetti presi da un dominio totalmente ordinato, ordinare S Esempi: ordinare una lista di nomi alfabeticamente, o un

Dettagli

Algoritmi e strutture dati. Analisi di algoritmi Funzioni di costo, notazione asintotica

Algoritmi e strutture dati. Analisi di algoritmi Funzioni di costo, notazione asintotica Algoritmi e strutture dati Analisi di algoritmi Funzioni di costo, notazione asintotica Alberto Montresor Università di Trento 2016/09/11 This work is licensed under a Creative Commons Attribution-ShareAlike

Dettagli

Algoritmi di ordinamento

Algoritmi di ordinamento Algoritmi di ordinamento! Selection Sort! Quick Sort! Lower bound alla complessità degli algoritmi di ordinamento Ordinamento 1 Selection Sort SelectionSort(dati[]) { for (i=0; idati.length-1; i++) { min

Dettagli

Esercitazione 1. Introduzione agli algoritmi di ordinamento

Esercitazione 1. Introduzione agli algoritmi di ordinamento Esercitazione 1 Introduzione agli algoritmi di ordinamento Algoritmi di ordinamento Algoritmi utilizzati per elencare gli elementi di un insieme secondo una sequenza stabilita da una relazione d'ordine,

Dettagli

Sommario. Un algoritmo di ordinamento di complessità lineare: CountingSort. [CLRS10] cap. 8 par.8.2

Sommario. Un algoritmo di ordinamento di complessità lineare: CountingSort. [CLRS10] cap. 8 par.8.2 Sommario Un algoritmo di ordinamento di complessità lineare: CountingSort [CLRS10] cap. 8 par.8.2!1 Ordinamento in tempo lineare. Il limite inferiore Ω(n log n) vale per tutti gli algoritmi di ordinamento

Dettagli

QuickSort (1962, The Computer Journal)

QuickSort (1962, The Computer Journal) QuickSort (1962, The Computer Journal) Charles Antony Richard Hoare (1934 -) Attualmente senior researcher al Microsoft Research Center di Cambridge Hoare ha vinto nel 1980 il Turing Award, il premio più

Dettagli

Algoritmi di ordinamento: Array e ricorsione

Algoritmi di ordinamento: Array e ricorsione Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ 1 Algoritmi di ordinamento: Array e ricorsione 2 1 Insertion Sort Quicksort Heapsort Indice

Dettagli

Esempio: rappresentare gli insiemi

Esempio: rappresentare gli insiemi Esempio: rappresentare gli insiemi Problema: rappresentare gli insiemi Vedremo che la scelta della rappresentazione per implementarli non è così ovvia come era stato per i numeri razionali In realtà ci

Dettagli

Informatica Generale Andrea Corradini Algoritmi: ordinamento per inserimento e ricorsione

Informatica Generale Andrea Corradini Algoritmi: ordinamento per inserimento e ricorsione Informatica Generale Andrea Corradini 14 - Algoritmi: ordinamento per inserimento e ricorsione Sommario Un algoritmo iterativo: l'ordinamento per inserimento (insertion sort) La ricorsione: i numeri triangolari

Dettagli

Prova di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE

Prova di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE Prova di Algoritmi e s.d. (1o anno) 17 Settembre 2002 TESTO e RISPOSTE Esercizio 1 (punti 7 in prima approssimazione) Consideriamo alberi binari con insieme dei nodi NODI = N (l'insieme dei naturali).

Dettagli

Tecniche Algoritmiche: divide et impera

Tecniche Algoritmiche: divide et impera Tecniche Algoritmiche: divide et impera Una breve presentazione F. Damiani - Alg. & Lab. 04/05 Divide et impera (o Divide and conquer) Per regnare occorre tenere divisi i nemici e trarne vantaggio F. Damiani

Dettagli

Algoritmi di ordinamento

Algoritmi di ordinamento Algoritmi di ordinamento Il problema Vogliamo ordinare un array monodimensionale in modo crescente per il caso decrescente valgono le stesse considerazioni Vari algoritmi possibili Diverse caratteristiche

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Algoritmi Ricorsivi e Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino I conigli di Fibonacci Ricerca Binaria L isola dei conigli Leonardo da

Dettagli

Problemi di ordinamento

Problemi di ordinamento Problemi di ordinamento Input: una sequenza di n numeri a 1, a 2,..., a n ; Output: una permutazione a 1, a 2,..., a n di a 1, a 2,..., a n tale che a 1 a 2... a n. Generalmente, la sequenza è rappresentata

Dettagli

T 1 =1. n 4 n log n. T n =3 T. Esercizio 1 (6 punti) A.A Esame di Algoritmi e strutture dati 18 luglio 2008

T 1 =1. n 4 n log n. T n =3 T. Esercizio 1 (6 punti) A.A Esame di Algoritmi e strutture dati 18 luglio 2008 A.A. 00 0 Esame di Algoritmi e strutture dati luglio 00 Esercizio (6 punti) Risolvere con almeno due metodi diversi la seguente relazione di ricorrenza T = T n = T n n log n A.A. 00 0 Esame di Algoritmi

Dettagli

ORDINAMENTO PER SELEZIONE ORDINAMENTO PER SELEZIONE ORDINAMENTO VELOCE CONFRONTI

ORDINAMENTO PER SELEZIONE ORDINAMENTO PER SELEZIONE ORDINAMENTO VELOCE CONFRONTI ORDINAMENTO PER SELEZIONE Per l analisi delle prestazioni di tale algoritmo di ordinamento, si considerano i due cicli for annidati: poiché i confronti avvengono nel ciclo interno si ha che n 2 i= 0 (

Dettagli

Informatica II. Capitolo 2 Analisi di algoritmi. Valutare la complessità in tempo. Complessità in tempo: cosa serve?

Informatica II. Capitolo 2 Analisi di algoritmi. Valutare la complessità in tempo. Complessità in tempo: cosa serve? Valutare la complessità in tempo Complessità in tempo: cosa serve? Informatica II Capitolo 2 Analisi di algoritmi Per stimare il tempo impiegato da un programma Per stimare il più grande input gestibile

Dettagli

Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione

Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione Laboratorio di Algoritmi e Strutture Dati Aniello Murano http://people.na.infn.it people.na.infn.it/~murano/ Heap e Heapsort Algoritmi di ordinamento Insertion Sort Quicksort Heapsort Insertion Sort L

Dettagli

Quicksort. Quicksort: idea di base. Riprendiamo il problema dell'ordinamento di n oggetti.

Quicksort. Quicksort: idea di base. Riprendiamo il problema dell'ordinamento di n oggetti. Riprendiamo il problema dell'ordinamento di n oggetti. Quicksort Per questo problema abbiamo già visto gli algoritmi insertion-sort e mergesort. Il tempo di esecuzione di insertion-sort è (n 2 ). Il tempo

Dettagli

Notazioni asintotiche. Martedì 30 settembre 2014

Notazioni asintotiche. Martedì 30 settembre 2014 Notazioni asintotiche Martedì 30 settembre 2014 Punto della situazione Cos è un algoritmo Tempo di esecuzione T(n) Analisi di algoritmi: analisi asintotica di T(n) Argomento di oggi: Notazioni asintotiche:

Dettagli

nel trasformare una sequenza di elementi

nel trasformare una sequenza di elementi Ordinamento Carla Binucci e Walter Didimo Il problema dell ordinamento In generale, il Problema dell ordinamento consiste nel trasformare una sequenza di elementi rendendola ordinata rispetto a un certo

Dettagli

Linguaggio C. Problemi di Ricerca e Ordinamento: Algoritmi e Complessità.

Linguaggio C. Problemi di Ricerca e Ordinamento: Algoritmi e Complessità. Linguaggio C Problemi di Ricerca e Ordinamento: Algoritmi e Complessità. 1 Complessità degli Algoritmi Si definisce Complessità di un Algoritmo C(A) la funzione dei parametri rilevanti per A che determina

Dettagli

Informatica 3. LEZIONE 16: Heap - Codifica di Huffmann. Modulo 1: Heap e code di priorità Modulo 2: Esempio applicativo: codifica di Huffmann

Informatica 3. LEZIONE 16: Heap - Codifica di Huffmann. Modulo 1: Heap e code di priorità Modulo 2: Esempio applicativo: codifica di Huffmann Informatica 3 LEZIONE 16: Heap - Codifica di Huffmann Modulo 1: Heap e code di priorità Modulo 2: Esempio applicativo: codifica di Huffmann Informatica 3 Lezione 16 - Modulo 1 Heap e code di priorità Introduzione

Dettagli

Calcolare lo Span di un array di numeri

Calcolare lo Span di un array di numeri Calcolare lo Span di un array di numeri Altro esempio di come usare una pila come struttura dati ausiliaria per un algoritmo: Dato un array X, lo span S[i] di X[i] è il massimo numero di elementi consecutivi

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Algoritmi di Ordinamento Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino Il problema dell ordinamento Il problema dell ordinamento di un insieme

Dettagli

Appendice B. Algoritmi e Complessità

Appendice B. Algoritmi e Complessità Appendice B Algoritmi e Complessità 1. Introduzione Un algoritmo A è una procedura passo-passo per risolvere un problema P. Un problema P è caratterizzato dall insieme I delle sue istanze. L algoritmo

Dettagli

MERGESORT. Abstract. In questo articolo ci proponiamo di analizzare le due tipologie ricorsive mergesort

MERGESORT. Abstract. In questo articolo ci proponiamo di analizzare le due tipologie ricorsive mergesort MERGESORT a cura di Alessandro Lucchetta e Luca Gagliano Realizzato nell'ambito del progetto Archimede con la supervisione dei Pro. Fabio Breda, Rizzo Gabriele, Valentina Fabbro e Francesco Zampieri I.S.I.S.S.

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Algoritmi Ricorsivi e Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino A.A. 2006/07 I conigli di Fibonacci Ricerca Binaria L isola dei conigli

Dettagli

Divide et impera. Vittorio Maniezzo Università di Bologna

Divide et impera. Vittorio Maniezzo Università di Bologna Divide et impera 1 Vittorio Maniezzo Università di Bologna Divide et Impera Divide et impera: Dividi: se l istanza del problema da risolvere è troppo complicata per essere risolta direttamente, dividila

Dettagli

2a Prova parziale di Algoritmi e s.d. (1o anno) 13 Giugno 2002 TESTO E RISPOSTE. ATTENZIONE: questa e` una delle varianti...

2a Prova parziale di Algoritmi e s.d. (1o anno) 13 Giugno 2002 TESTO E RISPOSTE. ATTENZIONE: questa e` una delle varianti... 2a Prova parziale di Algoritmi e s.d. (1o anno) 13 Giugno 2002 TESTO E RISPOSTE ATTENZIONE: questa e` una delle varianti... Esercizio 1 (punti 3 + 1 per chi si e` accorto dell'errore...e) Consideriamo

Dettagli

Algoritmi e Strutture Dati. Analisi di algoritmi Funzioni di costo, notazione asintotica

Algoritmi e Strutture Dati. Analisi di algoritmi Funzioni di costo, notazione asintotica Algoritmi e Strutture Dati Analisi di algoritmi Funzioni di costo, notazione asintotica Alberto Montresor Università di Trento 2018/12/27 This work is licensed under a Creative Commons Attribution-ShareAlike

Dettagli

Scopo: ordinare una sequenza di elementi in base a una certa relazione d ordine. Ipotesi: gli elementi siano memorizzati in un array.

Scopo: ordinare una sequenza di elementi in base a una certa relazione d ordine. Ipotesi: gli elementi siano memorizzati in un array. ALGORITMI DI ORDINAMENTO Scopo: ordinare una sequenza di elementi in base a una certa relazione d ordine lo scopo finale è ben definito algoritmi equivalenti diversi i algoritmi i possono avere efficienza

Dettagli

ALGORITMI DI ORDINAMENTO

ALGORITMI DI ORDINAMENTO ALGORITMI DI ORDINAMENTO Scopo: ordinare una sequenza di elementi in base a una certa relazione d ordine lo scopo finale è ben definito algoritmi equivalenti diversi algoritmi possono avere efficienza

Dettagli

Un esempio di calcolo di complessità: insertion sort

Un esempio di calcolo di complessità: insertion sort Un esempio di calcolo di complessità: insertion sort Vediamo su un esempio come si può calcolare la complessità di un algoritmo... L esempio è un metodo semplice per ordinare arrays: insertion sort, o

Dettagli

ALGORITMI DI ORDINAMENTO

ALGORITMI DI ORDINAMENTO ALGORITMI DI ORDINAMENTO Scopo: ordinare una sequenza di elementi in base a una certa relazione d ordine lo scopo finale è ben definito algoritmi equivalenti diversi algoritmi possono avere efficienza

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Algoritmi e Strutture Dati Capitolo 17 - Algoritmi probabilistici Alberto Montresor Università di Trento This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To

Dettagli

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati Algoritmi Ricorsivi e Ricorrenze Maria Rita Di Berardini 2, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino 2 Polo di Scienze Università di Camerino ad Ascoli Piceno

Dettagli

Esercizi di Algoritmi e Strutture Dati

Esercizi di Algoritmi e Strutture Dati Esercizi di Algoritmi e Strutture Dati Moreno Marzolla http://www.moreno.marzolla.name/ Ultima Modifica: 7 ottobre 202 Copyright Portions of this work are Copyright 202, Moreno Marzolla. This work is licensed

Dettagli

COGNOME E NOME (IN STAMPATELLO) MATRICOLA

COGNOME E NOME (IN STAMPATELLO) MATRICOLA Politecnico di Milano Facoltà di Ingegneria dell Informazione Informatica 3 Proff. Campi, Ghezzi, Matera e Morzenti Seconda prova in itinere 4 Luglio 2006 COGNOME E NOME (IN STAMPATELLO) MATRICOLA Risolvere

Dettagli

Ordinamenti. Vittorio Maniezzo Università di Bologna

Ordinamenti. Vittorio Maniezzo Università di Bologna Ordinamenti 1 Vittorio Maniezzo Università di Bologna Grafo : definizione Un grafo G = (V,E)è composto da: V: insieme di vertici E V V: insieme di archi (edge) che connettono i vertici Un arco a= {u,v}

Dettagli

Algoritmi di ricerca. Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati.

Algoritmi di ricerca. Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati. E. Calabrese: Fondamenti di Informatica Algoritmi-1 Algoritmi di ricerca Per ricerca si intende qui il procedimento di localizzare una particolare informazione in un elenco di dati. Per esempio: - cercare

Dettagli

ALGORITMI DI ORDINAMENTO ALGORITMI DI ORDINAMENTO

ALGORITMI DI ORDINAMENTO ALGORITMI DI ORDINAMENTO ALGORITMI DI ORDINAMENTO Scopo: ordinare una sequenza di elementi in base a una certa relazione d ordine lo scopo finale è ben definito algoritmi equivalenti diversi algoritmi possono avere efficienza

Dettagli

Note per il corso di Complementi di Algoritmi e Strutture Dati

Note per il corso di Complementi di Algoritmi e Strutture Dati Note per il corso di Complementi di Algoritmi e Strutture Dati a.a. 12/13 - Versione provvisoria Elena Zucca 8 gennaio 2013 Indice Introduzione 1 1 Analisi della correttezza e complessità degli algoritmi

Dettagli

Università di Roma Tor Vergata L16-1. Ricerca: esaminare una collezione di dati, cercando un particolare valore. nome e cognome

Università di Roma Tor Vergata L16-1. Ricerca: esaminare una collezione di dati, cercando un particolare valore. nome e cognome Università di Roma Tor Vergata L16-1 Ricerca: esaminare una collezione di dati, cercando un particolare valore (per: ) reperire informazione modificarla stamparla cancellarla esempio: archivio studenti

Dettagli

Ordinamenti. Grafo : definizione. Un grafo G = (V,E)è composto da: V: insieme di vertici E V V: insieme di archi (edge) che connettono i vertici

Ordinamenti. Grafo : definizione. Un grafo G = (V,E)è composto da: V: insieme di vertici E V V: insieme di archi (edge) che connettono i vertici Ordinamenti 1 Vittorio Maniezzo Università di Bologna Grafo : definizione Un grafo G = (V,E)è composto da: V: insieme di vertici E V V: insieme di archi (edge) che connettono i vertici Un arco a= {u,v}

Dettagli

Algoritmi e strutture dati

Algoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 4 Ordinamento Ordinamento Dato un insieme S di n oggetti presi da un dominio totalmente ordinato, ordinare S Esempi: ordinare alfabeticamente lista di nomi, o insieme

Dettagli

Dispense per i corsi di Informatica generale Corso di laurea in Matematica e. Introduzione agli Algoritmi Corso di laurea in Informatica

Dispense per i corsi di Informatica generale Corso di laurea in Matematica e. Introduzione agli Algoritmi Corso di laurea in Informatica Dispense per i corsi di Informatica generale Corso di laurea in Matematica e Introduzione agli Algoritmi Corso di laurea in Informatica Prof. Tiziana Calamoneri Prof. Giancarlo Bongiovanni Questi appunti

Dettagli

Tecniche di analisi degli algoritmi

Tecniche di analisi degli algoritmi Tecniche di analisi degli algoritmi Moreno Marzolla, Lorenzo Donatiello Dipartimento di Infromatica, Università di Bologna 11 novembre 2014 Copyright c 2009, 2010 Moreno Marzolla, Università di Bologna

Dettagli

A. Ferrari Algoritmi notevoli

A. Ferrari Algoritmi notevoli Algoritmi notevoli in linguaggio C algoritmi o o o ricerca (verificare la presenza di un valore in un array) o o o ricerca sequenziale (array non ordinato) ricerca sequenziale (array ordinato) ricerca

Dettagli

In questa lezione. Heap binario heapsort. [CLRS10] cap. 6, par Prof. E. Fachini - Intr. Alg.

In questa lezione. Heap binario heapsort. [CLRS10] cap. 6, par Prof. E. Fachini - Intr. Alg. In questa lezione Heap binario heapsort [CLRS10] cap. 6, par. 6.1-6.4!1 Heap binari Un heap binario è una struttura dati consistente di un array visto come un albero binario. A= 5 60 65 30 50 18 40 25

Dettagli

Complementi di Algoritmi e Strutture Dati. Soluzioni prova scritta 7 giugno 2017

Complementi di Algoritmi e Strutture Dati. Soluzioni prova scritta 7 giugno 2017 Complementi di Algoritmi e Strutture Dati (III anno Laurea Triennale - a.a. 2016/17) Soluzioni prova scritta 7 giugno 2017 Esercizio Union find (punti 6) Considerare la foresta union-find sottostante e

Dettagli

Ordinamento. Lorenzo Donatiello,Moreno Marzolla Dip. di Scienze dell'informazione Università di Bologna

Ordinamento. Lorenzo Donatiello,Moreno Marzolla Dip. di Scienze dell'informazione Università di Bologna Ordinamento Lorenzo Donatiello,Moreno Marzolla Dip. di Scienze dell'informazione Università di Bologna Original work Copyright Alberto Montresor, University of Trento (http://www.dit.unitn.it/~montreso/asd/index.shtml)

Dettagli

INFORMATICA GENERALE

INFORMATICA GENERALE CAROSELLI STEFANO INFORMATICA GENERALE TESINA «LA TECNICA DEL DIVIDE-ET-IMPERA E DUE SUE IMPORTANTI APPLICAZIONI: IL QUICK SORT E IL MERGE SORT» La tecnica del DIVIDE-ET-IMPERA è un metodo di risoluzione

Dettagli

Prova di Algoritmi e s.d. (1o anno) 7 Febbraio TESTO e RISPOSTE

Prova di Algoritmi e s.d. (1o anno) 7 Febbraio TESTO e RISPOSTE Prova di Algoritmi e s.d. (1o anno) 7 Febbraio 2003 TESTO e RISPOSTE Esercizio 1 (punti 5 in prima approssimazione) Consideriamo alberi binari con insieme dei nodi NODI = N (l'insieme dei naturali). Riportiamo

Dettagli

2. Analisi degli Algoritmi

2. Analisi degli Algoritmi 2. Analisi degli Algoritmi Introduzione 2.1 Un modello di macchina elementare: la Macchina a Registri 2.2 Costo di esecuzione di un programma 2.3 Analisi del costo di esecuzione: il modello a costi uniformi

Dettagli