Algoritmi e Strutture Dati Capitolo 4 Ordinamento Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano …alcuni richiami Ricorda: Un algoritmo A ha costo di esecuzione T(n)=O(g(n)) su istanze di dimensione n e rispetto ad una certa risorsa di calcolo, se la quantità T(n) di risorsa sufficiente per eseguire A nel caso peggiore (e quindi sufficiente per ogni istanza di dimensione n) verifica la relazione T(n)=O(g(n)) Ricorda inoltre: Un algoritmo A ha costo di esecuzione T(n)=(g(n)) su istanze di dimensione n e rispetto ad una certa risorsa di calcolo, se la quantità T(n) di risorsa necessaria per eseguire A nel caso peggiore (e quindi non è detto che sia necessaria per ogni istanza di dimensione n: istanze facili potrebbero richiedere meno risorse) verifica la relazione T(n)= (g(n)) 2 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Quindi: • Se scrivo che un algoritmo ha complessità T(n) = O(f(n)), intendo semplicemente dire che per tutte le istanze di input l’algoritmo termina in O(f(n)). Se invece scrivo che un algoritmo ha complessità T(n) = (f(n)), intendo dire esiste almeno una istanza di input per cui T(n) = (f(n)). Quindi, se scrivo che un algoritmo ha complessità T(n) = Θ(f(n)), intendo dire che T(n)=O(f(n)) per tutte le istanze di input, ma anche che esiste almeno una istanza di input per cui T(n) = (f(n)). • • 3 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano …altri richiami Ricorda: Un problema P ha una complessità O(f(n)) rispetto ad una certa risorsa di calcolo (upper bound) se esiste un algoritmo che risolve P il cui costo di esecuzione rispetto a quella risorsa è O(f(n)) Ricorda: Un problema P ha una complessità (f(n)) rispetto ad una certa risorsa di calcolo (lower bound) se ogni algoritmo che risolve P ha costo di esecuzione (f(n)) rispetto a quella risorsa 4 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano …per il problema dell’ordinamento… • Upper bound temporale: O(n2) – Insertion Sort, Selection Sort • Lower bound temporale: (n) – banale: dimensione dell’input Abbiamo un gap lineare tra upper bound e lower bound! Possiamo fare meglio? 5 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Ordinamento per confronti Dati due elementi ai ed aj, per determinarne l’ordinamento relativo effettuiamo una delle seguenti operazioni di confronto: a i aj ; ai aj ; a i aj ; ai aj ; ai aj Non si possono esaminare i valori degli elementi o ottenere informazioni sul loro ordine in altro modo. Notare: Tutti gli algoritmi di ordinamento considerati fino ad ora sono algoritmi di ordinamento per confronto. 6 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Lower bound (n log n) per l’ordinamento Consideriamo un generico algoritmo A, che ordina eseguendo solo confronti: dimostreremo che A esegue (nel caso peggiore) (n log n) confronti 7 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Gli algoritmi di ordinamento per confronto possono essere descritti in modo astratto in termini di alberi di decisione. Un generico algoritmo di ordinamento per confronto lavora nel modo seguente: - Confronta due elementi ai ed aj (ad esempio effettua il test ai aj); - A seconda del risultato – riordina e/o decide il confronto successivo da eseguire. Albero di decisione - Descrive i confronti che l’algoritmo esegue quando opera su un input di una determinata dimensione. I movimenti dei dati e tutti gli altri aspetti dell’algoritmo vengono ignorati 8 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Alberi di decisione • Descrive le diverse sequenze di confronti che A potrebbe fare su istanze di lunghezza n • Nodo interno (non foglia): i:j – modella il confronto tra ai e aj • Nodo foglia: – modella una risposta (output) dell’algoritmo: permutazione degli elementi Input: a1,a2,a3 Š 1,2,3 Š 2:3 Š 1,3,2 9 1:2 Š 1:3 3,1,2 2,1,3 1:3 Š 2,3,1 Riconoscete l’algoritmo associato? 2:3 3,2,1 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Osservazioni • L’albero di decisione non è associato ad un problema • L’albero di decisione è associato ad un algoritmo e a una dimensione dell’istanza • L’albero di decisione descrive le diverse sequenze di confronti che un certo algoritmo può eseguire su istanze di una certa dimensione 10 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati NonsenseSort (A) Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Esempio if n 3 then 1. 2. if A[1]>A[n] then 3. scambia A[1] con A[n] 4. scambia A[2] con A[n] 5. Albero di decisione di NonsenseSort con n > 2 else 1: n 6. scambia A[1] con A[2] 7. if A[1] > A[n] then 8. scambia A[1] con A[2] n,1,3,…,n-1,2 2: n > 2,1,3,…,n 11 > 1,2,3,…,n Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano …alcune definizioni… Sotto-albero sinistro Š 1,2,3 2:3 Š 1,3,2 radice 1:2 Š 1:3 Š 3,1,2 Sotto-albero destro 2,1,3 1:3 Š 2,3,1 2:3 3,2,1 Profondità di un nodo: lunghezza del cammino che lo congiunge alla radice. Altezza di un albero: valore massimo della profondità dei nodi. 12 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Proprietà • Per una particolare istanza, i confronti eseguiti da A su quella istanza rappresentano un cammino radice – foglia • L’algoritmo segue un cammino diverso a seconda delle caratteristiche dell’input – Caso peggiore: cammino più lungo – Caso migliore: cammino più breve • Il numero di confronti nel caso peggiore è pari all’altezza dell’albero di decisione • Un albero di decisione di un algoritmo che risolve il problema dell’ordinamento di n elementi contiene almeno n! foglie 13 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Altezza in funzione delle foglie Lemma: Un albero binario con k foglie in cui ogni nodo interno ha esattamente due figli, ha altezza h(k) almeno log2 k. Dim: Dimostrazione per induzione su k: – Caso base k=1: banale h(k)=0≥ log21=0 – Supposto vero per k-1 foglie, dimostriamolo per k; poiché la radice ha 2 figli, almeno 1 dei due suoi sottoalberi deve contenere almeno la metà delle foglie, e quindi h(k) ≥1+h(k/2) ≥ (hp induttiva) 1+log2(k/2) =1+log2k-log22=log2k. QED 14 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Il lower bound (n logn) • Consideriamo l’albero di decisione di un qualsiasi algoritmo che risolve il problema dell’ordinamento di n elementi • L’altezza h dell’albero di decisione è almeno log2 (n!) • Formula di Stirling: n! (2pn)1/2 ·(n/e)n h log2(n!) > log2 (n/e)n = = n log2 (n/e) = n! > (n/e)n = n log2 n – n log2 e = = (n log n) 15 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Un algoritmo ottimo: il MergeSort • Problema dell’ordinamento: – Lower bound - (n log n) albero di decisione – Upper bound – O(n2) IS,SS • Proviamo a costruire un algoritmo ottimo, usando la tecnica del divide et impera: 1 Divide: dividi l’array a metà 2 Risolvi il sottoproblema ricorsivamente 3 Impera: fondi le due sottosequenze ordinate 16 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Esempio di esecuzione 17 7 2 4 5 3 1 5 6 input 1 2 3 4 5 5 6 7 output 7 2 4 5 3 1 5 6 2 4 5 7 1 3 5 6 7 2 4 5 3 1 5 6 2 7 4 5 1 3 5 6 Input ed output delle chiamate ricorsive 7 2 4 5 3 1 5 6 7 2 4 5 3 1 5 6 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Procedura Merge • Due array ordinati A e B possono essere fusi rapidamente: – estrai ripetutamente il minimo di A e B e copialo nell’array di output, finché A oppure B non diventa vuoto – copia gli elementi dell’array non vuoto alla fine dell’array di output Notazione: dato un array A e due indici x y, denotiamo con A[x;y] la porzione di A costituita da A[x], A[x+1],…,A[y] 18 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Merge (A, i1, f1, f2) 1. Sia X un array ausiliario di lunghezza f2-i1+1 2. i=1 3. i2=f1+1 4. while (i1 f1 e i2 f2) do 5. if (A[i1] A[i2]) 6. then X[i]=A[i1] 7. 8. 9. incrementa i e i1 else X[i]=A[i2] incrementa i e i2 10. if (i1<f1) then copia A[i1;f1] alla fine di X 11. else copia A[i2;f2] alla fine di X 12. copia X in A[i1;f2] 19 fonde A[i1;f1] e A[f1+1;f2] output in A[i1;f2] Osservazione: sto usando un array ausiliario Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Lemma La procedure Merge fonde due sequenze ordinate di lunghezza n1 e n2 eseguendo al più n1+ n2 -1 confronti dim Ogni confronto “consuma” un elemento di A. Nel caso peggiore tutti gli elementi tranne l’ultimo sono aggiunti alla sequenza X tramite un confronto. Il numero totale di elementi è n1+ n2. Quindi il numero totale di confronti è n1+ n2 -1. numero di confronti nel caso peggiore è (n1+ n2) Il numero di operazioni (confronti + copie)? (n1+ n2) 20 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano MergeSort (A, i, f) 1. if (i f) then return 2. m = (i+f)/2 3. MergeSort(A,i,m) 4. MergeSort(A,m+1,f) 5. Merge(A,i,m,f) 21 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano Tempo di esecuzione • Il numero di confronti del MergeSort è descritto dalla seguente relazione di ricorrenza: T(n) = 2 T(n/2) + O(n) T(1)=1 • Usando il Teorema Master si ottiene T(n) = O(n log n) a=b=2, f(n)=O(n) caso 2 22 Copyright © 2004 - The McGraw - Hill Companies, srl Algoritmi e strutture dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano …alcune osservazioni… • Il MergeSort è un algoritmo (asintoticamente) ottimo rispetto al numero di confronti eseguiti nel caso peggiore • Il MergeSort non ordina in loco – occupazione di memoria pari a 2n 23 Copyright © 2004 - The McGraw - Hill Companies, srl