La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.

Presentazioni simili


Presentazione sul tema: "Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Ordinamenti ottimi."— Transcript della presentazione:

1 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi (nel modello basato su confronti)

2 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 2 Usa la tecnica del divide et impera: 1 Divide: dividi larray a metà 2 Risolvi il sottoproblema ricorsivamente 3 Impera: fondi le due sottosequenze ordinate MergeSort

3 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 3 Esempio di esecuzione Input ed output delle chiamate ricorsive

4 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 4 Due array ordinati A e B possono essere fusi rapidamente: –estrai ripetutamente il minimo di A e B e copialo nellarray di output, finché A oppure B non diventa vuoto –copia gli elementi dellarray non vuoto alla fine dellarray di output Procedura Merge 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]

5 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 5 Merge (A, i 1, f 1, f 2 ) 1. Sia X un array ausiliario di lunghezza f 2 -i i=1 3. i 2 =f while (i 1 f 1 e i 2 f 2 ) do 5. if (A[i 1 ] A[i 2 ]) 6. then X[i]=A[i 1 ] 7. incrementa i e i 1 8. else X[i]=A[i 2 ] 9. incrementa i e i if (i 1

6 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 6 Lemma La procedure Merge fonde due sequenze ordinate di lunghezza n 1 e n 2 eseguendo al più n 1 + n 2 -1 confronti dim Ogni confronto consuma un elemento di A. Nel caso peggiore tutti gli elementi tranne lultimo sono aggiunti alla sequenza X tramite un confronto. Il numero totale di elementi è n 1 + n 2. Quindi il numero totale di confronti è n 1 + n numero di confronti nel caso peggiore è (n 1 + n 2 ) Il numero di operazioni (confronti + copie)? (n 1 + n 2 )

7 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 7 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)

8 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 8 Il numero di confronti del MergeSort è descritto dalla seguente relazione di ricorrenza: C(n) = 2 C(n/2) + O(n) Usando il Teorema Master si ottiene C(n) = O(n log n) Tempo di esecuzione a=b=2, f(n)=O(n) caso 2

9 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 9 …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

10 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 10 Stesso approccio incrementale del selectionSort –seleziona gli elementi dal più grande al più piccolo –usa una struttura dati efficiente estrazione in tempo O(log n) del massimo Tipo di dato –Specifica delle operazioni di interesse su una collezione di oggetti (es. inserisci, cancella, cerca) Struttura dati –Organizzazione dei dati che permette di supportare le operazioni di un tipo di dato usando meno risorse di calcolo possibile Cruciale: progettare una struttura dati H su cui eseguire efficientemente le operazioni: –dato un array A, generare velocemente H –trovare il più grande oggetto in H –cancellare il più grande oggetto da H HeapSort

11 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 11 Alberi: qualche altra definizione d=2 albero binario albero d-ario: albero in cui tutti i nodi interni hanno d figli un albero d-ario è completo se tutte le foglie sono allo stesso livello

12 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 12 Struttura dati heap associata ad un insieme S = albero binario radicato con le seguenti proprietà: 1) completo fino al penultimo livello (foglie sullultimo livello tutte compattate a sinistra) 2) gli elementi di S sono memorizzati nei nodi dellalbero 3) chiave(padre(v)) chiave(v) per ogni nodo v HeapSort

13 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl In questa direzione è presente un ordinamento In questa direzione non è presente un ordinamento …un esempio il massimo è contenuto nella radice!

14 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 14 Struttura dati heap è sufficiente un vettore di dimensione n Rappresentazione con vettore posizionale sin(i) = 2i des(i) = 2i+1 padre(i)= i/2 in generale dimensione vettore diverso da numero elementi nello pseudocodice numero oggetti indicato con heapsize[A]

15 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 15 Proprietà salienti degli heap 1) Il massimo è contenuto nella radice 2) Lalbero ha altezza O(log n) 3) Gli heap con struttura rafforzata possono essere rappresentati in un array di dimensione pari a n

16 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 16 fixHeap(nodo v, heap H) if (v è una foglia) then return else sia u il figlio di v con chiave massima if ( chiave(v) < chiave(u) ) then scambia chiave(v) e chiave(u) fixHeap(u,H) La procedura fixHeap Se tutti i nodi di H tranne v soddisfano la proprietà di ordinamento a heap, possiamo ripristinarla come segue: Tempo di esecuzione: O(log n)

17 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 17 FixHeap - esempio i= i=

18 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 18 fixHeap (i,A) 1. s=sin(i) 2. d=des(i) 3. if (s heapsize[A] e A[s] >A[i]) 4. then massimo=s 5. else massimo=i 6. if (d heapsize[A] e A[d] >A[massimo]) 7. then massimo=d 8. if (massimo i) 9. then scambia A[i] e A[massimo] 10. fixHeap(massimo,A) …uno pseudocodice di fixHeap più dettagliato…

19 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 19 Copia nella radice la chiave contenuta nella la foglia più a destra dellultimo livello –nota: è lelemento in posizione n (n: dimensione heap) Rimuovi la foglia Ripristina la proprietà di ordinamento a heap richiamando fixHeap sulla radice Estrazione del massimo Tempo di esecuzione: O(log n)

20 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 20 heapify(heap H) if (H è vuoto) then return else heapify(sottoalbero sinistro di H) heapify(sottoalbero destro di H) fixHeap(radice di H,H) Costruzione dellheap Algoritmo ricorsivo basato sul divide et impera Tempo di esecuzione: T(n)= 2T(n/2)+O(log n) T(n) = O(n) dal Teorema Master

21 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 21 heapify (A) 1. Heapsize[A]=n 2. for i= n/2 down to 1 do 3. fixHeap(i,A) …una versione iterativa di heapify… Nota: gli elementi A[ n/2 +1],…,A[n] sono foglie dellalbero H = altezza albero log 2 (n) N nodi (h) = numero di nodi di altezza h n/2 h+1 ( n/2 h+1 ) 2

22 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 22 Costruisce un heap tramite heapify Estrae ripetutamente il massimo per n-1 volte –ad ogni estrazione memorizza il massimo nella posizione dellarray che si è appena liberata Lalgoritmo HeapSort

23 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 23 Esempio di esecuzione

24 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 24 heapSort (A) 1. Heapify(A) 2. for i=n down to 2 do 3. scambia A[1] e A[i] 4. Heapsize[A] = Heapsize[A] fixHeap(1,A) ordina in loco in tempo O(n log n) O(n) n-1 estrazioni di costo O(log n)

25 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 25 Usa la tecnica del divide et impera: 1 Divide: scegli un elemento x della sequenza (perno) e partiziona la sequenza in elementi x ed elementi >x 2 Risolvi i due sottoproblemi ricorsivamente 3 Impera: restituisci la concatenazione delle due sottosequenze ordinate QuickSort Rispetto al MergeSort, divide complesso ed impera semplice

26 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 26 QuickSort (A) 1. scegli elemento x in A 2. partiziona A rispetto a x calcolando: 3. A 1 ={y A : y x} 4. A 2 ={y A : y > x} 5. if (|A 1 | > 1) then QuickSort(A 1 ) 6. if (|A 2 | > 1) then QuickSort(A 2 ) 7. copia la concatenazione di A 1 e A 2 in A non partiziona in loco!

27 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 27 Partizione in loco Scorri larray in parallelo da sinistra verso destra e da destra verso sinistra –da sinistra verso destra, ci si ferma su un elemento maggiore del perno –da destra verso sinistra, ci si ferma su un elemento minore del perno Scambia gli elementi e riprendi la scansione

28 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 28 Partizione in loco: un esempio

29 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 29 Partition (A, i, f ) 1. x=A[i] 2. inf =i 3. sup= f while (true) do 5. do (inf=inf + 1) while (A[inf] x) 6. do (sup=sup-1) while (A[sup] > x) 7. if (inf < sup) then scambia A[inf] e A[sup] 8. else break 9. scambia A[i] e A[sup] 10. return sup Tempo di esecuzione: O(n) partiziona A[i;f] rispetto a A[i] Proprietà: In ogni istante, gli elementi A[i],…,A[inf-1] sono del perno, mentre gli elementi A[sup+1],…,A[f] sono > del perno mette il perno al centro

30 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 30 QuickSort (A, i, f ) 1. if (i f) then return 2. m=Partition(A,i,f) 3.QuickSort(A,i,m-1) 4.QuickSort(A, m +1,f)

31 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 31 Esempio di esecuzione Lalbero delle chiamate ricorsive può essere sbilanciato

32 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 32 Nel caso peggiore, il perno scelto ad ogni passo è il minimo o il massimo degli elementi nellarray Il numero di confronti è pertanto: C(n)=C(n-1) + O(n) Svolgendo per iterazione si ottiene C(n) = O(n 2 ) Analisi nel caso peggiore complessità nel caso migliore?

33 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 33 Caso migliore: O(n log n), partizionamento sempre bilanciato

34 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 34 …intuizioni sul caso medio… problema: la partizione può essere sbilanciata la probabilità che ad ogni passo si presenti la partizione peggiore è molto bassa per partizioni che non sono troppo sbilanciate lalgoritmo è veloce domanda: quale è la complessità dellalgoritmo supponendo che lalgoritmo di partizionamento produca sempre una partizione proporzionale 9-a-1 Nota: sembra una partizione piuttosto sbilanciata…

35 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 35 …la complessità è ancora O(n log n)

36 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 36 Randomizzazione Possiamo evitare il caso peggiore scegliendo come perno un elemento a caso Poiché ogni elemento ha la stessa probabilità, pari a 1/n, di essere scelto come perno, il numero di confronti nel caso atteso è: a=0 n-1 C(n)=n-1+C(a)+C(n-a-1) 1 n a=0 n-1 = n-1+C(a) 2 n dove a e (n-a-1) sono le dimensioni dei sottoproblemi risolti ricorsivamente

37 Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 37 La relazione di ricorrenza del quicksort ha soluzione Analisi nel caso medio C(n) 2 n log n Dimostrazione per sostituzione integrando per parti


Scaricare ppt "Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © 2004 - The McGraw - Hill Companies, srl 1 Ordinamenti ottimi."

Presentazioni simili


Annunci Google