Algoritmi e strutture Dati - Lezione 7

Slides:



Advertisements
Presentazioni simili
Strutture dati per insiemi disgiunti
Advertisements

Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Programmazione dinamica: problema della sottosequenza più lunga
                      Insertion-Sort
RB-alberi (Red-Black trees)
Code a priorità (Heap) Definizione
Alberi binari di ricerca
Code con priorità Ordinamento
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti lineari.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Capitolo 8 Code con priorità Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti lineari.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti lineari.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Il problema del dizionario
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Capitolo 1 Unintroduzione.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento: Selection e Insertion Sort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Alberi AVL (Adelson-Velskii.
Interrogazioni su un albero binario di ricerca Search(S,k) – dato un insieme S ed un valore chiave k restituisce un puntatore x ad un elemento in S tale.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Alberi AVL (Adelson-Velskii.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati (Mod. A)
Alberi di Ricorrenza Gli alberi di ricorrenza rappresentano un modo conveniente per visualizzare i passi di sostitu- zione necessari per risolvere una.
Algoritmi e Strutture Dati
Algoritmi e strutture dati
Algoritmi e Strutture Dati IV. Heap e Code di Priorità
Algoritmi e Strutture Dati III. Algoritmi di Ordinamento
Algoritmi e Strutture Dati 20 aprile 2001
Heap binari e HeapSort.
Heap binomiali Gli heap binomiali sono strutture dati su cui si possono eseguire efficientemente le operazioni: Make(H) : crea uno heap vuoto Insert(H,
QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)
Anche la RB-Delete ha due fasi: Nella prima viene tolto un nodo y avente uno dei sottoalberi vuoto sostituendolo con la radice dellaltro sottoalbero. Per.
RB-insert(T, z) // z.left = z.right = T.nil Insert(T, z) z.color = RED // z è rosso. Lunica violazione // possibile delle proprietà degli alberi // rosso-neri.
Heap Ordinamento e code di priorità Ugo de Liguoro.
Introduzione agli algoritmi e strutture dati 3/ed T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein Copyright © 2010 – The McGraw-Hill Companies srl.
Soluzione: Algoritmo Heap-Sort Un array A[1..n] può essere interpretato come un albero binario: A[1] è la radice, A[2i] e A[2i+1] sono i figli di A[i]
1/32 Algoritmi e Strutture Dati HEAP Anno accademico
Algoritmi e Strutture Dati Luciano Gualà
Heap concetti ed applicazioni. maggio 2002ASD - Heap2 heap heap = catasta condizione di heap 1.albero binario perfettamente bilanciato 2.tutte le foglie.
Algoritmi e Strutture Dati
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
Capitolo 8 Code con priorità Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Lo strano mondo degli algoritmi di ordinamento Algoritmi.
1 Ordinamento (Sorting) INPUT: Sequenza di n numeri OUTPUT: Permutazione π = tale che a 1 ’  a 2 ’  … …  a n ’ Continuiamo a discutere il problema dell’ordinamento:
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
1 Ordinamento (Sorting) Input: Sequenza di n numeri Output: Permutazione π = tale che: a i 1  a i 2  ……  a i n Continuiamo a discutere il problema dell’ordinamento:
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Progettare algoritmi.
Capitolo 4 Ordinamento: lower bound Ω(n log n) e MergeSort ((*) l’intera lezione) Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Capitolo 1 Un’introduzione.
Algoritmi e Strutture Dati HeapSort. Select Sort: intuizioni L’algoritmo Select-Sort  scandisce tutti gli elementi dell’array a partire dall’ultimo elemento.
Progettare algoritmi veloci usando strutture dati efficienti
Progettare algoritmi veloci usando strutture dati efficienti
Progettare algoritmi veloci usando strutture dati efficienti
HeapSort Stesso approccio incrementale del selectionSort Tipo di dato
Transcript della presentazione:

Algoritmi e strutture Dati - Lezione 7 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log n)  Algoritmo di ordinamento ottimale. A differenza degli algoritmi IS e SS, Merge-Sort non è però un algoritmo di ordinamento in loco. Infatti, la procedura Merge(A,p,q,r) richiede un vettore di appoggio di dimensione r-p+1 in cui effettuare la fusione  È facile convincersi del fatto che il Merge-Sort ha complessità spaziale S(n)=O(n log n) (infatti ho bisogno di O(n) spazio ausiliario per ognuno dei log n livelli dell’albero della ricorsione)  Ciò comporta (insieme alla gestione della struttura ricorsiva) anche una spesa in termini di tempo effettivo dell’esecuzione (infatti, lo spazio ausiliario richiesto non eccede O(n log n) e quindi non modifica l’andamento asintotico temporale, ma il tutto si riflette sulle costanti moltiplicative!) Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 Algortimo di ordinamento ottimale in loco: Heapsort Introduciamo un nuovo algoritmo di ordinamento detto Heap-Sort che ha le seguenti caratteristiche: - T(n) = O(n log n)  Alg. Ordinamento ottimale Ordina in loco e quindi S(n)=O(n) Per fare ciò dobbiamo introdurre una struttura di dati detta heap. Heap binario = albero binario in cui ogni nodo figlio ha valore minore o uguale al valore del proprio nodo padre. Es. 16 14 10 8 7 9 3 2 4 1 L’albero è quasi completo  Completo su tutti i livelli tranne eventualmente sul livello più basso che è riempito da sinistra. Altezza dell’albero  lunghezza del più lungo cammino discendente dalla radice ad una foglia. Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 Proprietà di un heap Notiamo che: 16 14 10 In questa direzione è presente un ordinamento 8 7 9 3 2 4 1 In questa direzione non è presente un ordinamento. Proprietà di ordinamento parziale dello heap: Ogni nodo interno contiene un valore maggiore uguale del valore contenuto nei figli. Da ciò segue che: l’elemento più grande dello heap è memorizzato nella radice. ogni nodo interno contiene un valore maggiore uguale del valore contenuto in tutti i suoi discendenti. Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 Come rappresentare uno heap: dall’albero binario all’array i=1 16 2 3 14 10 4 5 6 7 8 7 9 3 8 9 10 2 4 1 Un albero binario quasi completo può essere descritto da un array in cui il figlio sinistro ed il figlio destro di un nodo i si trovano nelle posizioni 2i e 2i+1 rispettivamente. i=1 2 3 4 5 6 7 8 9 10 … … Length[A] 16 14 10 8 7 9 3 2 4 1 … … … Heap-size[A] N.B. Stiamo assumendo che l’indice i parta da 1. Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 16 2 3 14 10 4 5 6 7 8 7 9 3 8 9 10 2 4 1 i=1 2 3 4 5 6 7 8 9 10 … … Length[A] 16 14 10 8 7 9 3 2 4 1 … … … Heap-size[A] Heap-size[A] ≤ Length[A] Per muoverci all’interno dell’albero definiamo le seguenti procedure: Parent(i) returni/2 Left(i) Return 2i Right(i) Return 2i+1 Affinché un array A che rappresenta un albero binario sia uno heap deve valere la relazione: A(parent[i])  A[i] per ogni i  1 Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 Mostreremo che un array generico può essere ordinato trasformandolo in un heap ed eseguendo operazioni che hanno tempo di esecuzione al più proporzionale alla altezza H dello heap. Notiamo: H=3 H = altezza albero binario Se l’albero è completo: n = 1 +2 + 22 + … + 2H = 2H*( 1 + (1/2) + … + (1/2)H)= = 2H*(2-(1/2)H) = 2H+1 –1 Se l’albero è quasi completo: 2H -1 < n < 2 H+1 –1  H = (log(n)) i=1 16 2 3 14 10 4 5 6 7 8 7 9 3 8 9 10 2 4 1 Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 Algoritmo Heapsort - strategia L’ idea di base è la seguente: Trasformiamo un array A di dimensione n in un heap di dimensione n (creazione dell’heap); Passo 1: Per le proprietà dello heap, sappiamo che l’elemento massimo della sequenza iniziale è memorizzato in A[1]. Scambiamo A[1] con l’elemento A[n]; La sequenza A[1]……A[n-1] che otteniamo non è più uno heap (A[1] è fuori posto). Permutiamo i suoi elementi in moto da trasformarla in un heap di dimensione n-1 (mantenimento dell’heap); Passo 2: Per le proprietà dello heap, sappiamo che l’elemento massimo della sequenza A[1]……A[n-1] è memorizzato in A[1]. Scambiamo A[1] con l’elemento A[n-1]; …… Ripetendo n-1 volte otteniamo una sequenza ordinata. Le operazioni che effettuiamo sono: Creazione di un heap O(n) Agli step k=1,2,…n-1: Scambio di due elementi O(1) (temporale e spaziale) Mantenimento dello heap O(log n) Poiché abbiamo n-1 iterazioni  T(n)=O(n log n) …e poiché eseguiamo il tutto in loco  S(n)=O(n) Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 Procedura di mantenimento dell’heap Supponiamo che A sia uno heap. Alteriamo il valore di A[1]. L’array che otteniamo non è più un heap. I sottoalberi con radice in A[right(1)] ed A[left(1)] sono ancora heap. Dobbiamo scrivere una procedura che permuti gli elementi A[1],A[2],……,A[heap-size[A]] in modo da ricostruire uno heap. FixHeap(A,i) lleft(i) rright(i) If (l heap-size[A]) and (A[l] > A[i]) then largest  l else largest  i If (r  heap-size[A] )and(A[r] > A[largest]) then largest  r If (largest  i) then scambia(A[i], A[largest]) FixHeap(A,largest) La procedura FixHeap fa “scendere” A[i] nella prima posizione utile. Ipotesi necessaria per la correttezza- I sottoalberi con radice in A[right(i)] ed A[left(i)] sono heap. Tempo di esecuzione di FixHeap(A,i)  O(hi) hi = altezza del nodo i (il livello più basso delle foglie ha altezza 0) Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 FixHeap - esempio i=1 16 2 3 4 10 4 5 6 7 14 7 9 3 8 9 10 2 8 1 i=1 Lancio FixHeap(A,2): 16 2 3 14 10 4 5 6 7 4 7 9 3 8 9 10 2 8 1 i=1 16 2 3 14 10 4 5 6 7 8 7 9 3 8 9 10 2 4 1 Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 Procedura di creazione di uno heap La procedura FixHeap può essere usata in modo bottom-up per convertire un array A[1…n], in uno heap di lunghezza n. Heapify(A) heap-size[A]  lenght[A] For i  lenght[A]/2 down to 1 do FixHeap(A,i) Heapify “attraversa” i nodi non foglia dell’ heap, dal basso verso l’alto ed esegue FixHeap su ciascuno di essi.  Ad ogni step le ipotesi necessarie per applicare FixHeap sono automaticamente verificate. Tempo di esecuzione di Heapify? H = altezza albero  log2(n) Nnodi(h) = numero di nodi con altezza h  n/2h+1 Notare – Si può costruire un heap da un array non ordinato in tempo lineare! Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 Heapify – Un esempio i=1 4 2 3 1 3 4 5 6 7 2 16 9 10 8 9 10 14 8 7 i=1 4 2 3 1 3 4 5 6 7 2 16 9 10 8 9 10 14 8 7 i=1 4 2 3 1 3 4 5 6 7 14 16 9 10 8 9 10 2 8 7 Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 Heapify – Un esempio (2) i=1 4 2 3 1 10 4 5 6 7 14 16 9 3 8 9 10 2 8 7 i=1 4 2 3 16 10 4 5 6 7 14 1 9 3 8 9 10 2 8 7 i=1 4 2 3 16 10 4 5 6 7 14 7 9 3 8 9 10 2 8 1 Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 Heapify – Un esempio (3) i=1 16 2 3 4 10 4 5 6 7 14 7 9 3 8 9 10 2 8 1 i=1 16 2 3 14 10 4 5 6 7 4 7 9 3 8 9 10 2 8 1 i=1 16 2 3 14 10 4 5 6 7 8 7 9 3 8 9 10 2 4 1 E’ un heap! Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 Algoritmo Heapsort Heapsort(A) Heapify(A) O(n) For i length(A) down to 2 O(n) do Scambia(A[1],A[i]) O(n) Heapsize[A] Heapsize[A]-1 O(n) FixHeap(A,1) O(n log n) Tempo di esecuzione  O(n log n) Ordinamento in loco Esempio Input: A=<4,1,3,2,16,9,10,14,8,7> Heapify(A)  A0 =<16,14,10,8,7,9,3,2,4,1> Scambia(A[1],A[n]) i=1 16 2 3 14 10 4 5 6 7 8 7 9 3 8 9 10 2 4 1 Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 Heap-size = Heap-size -1 i=1 1 2 3 14 10 4 5 6 7 8 7 9 3 8 9 10 2 4 16 FixHeap(A,1) i=1 14 2 3 8 10 4 5 6 7 4 7 9 3 8 9 10 2 1 16 Algoritmi e strutture Dati - Lezione 7

Algoritmi e strutture Dati - Lezione 7 14 10 8 3 9 7 4 16 1 2 i=1 6 5 Scambia(A[1],A[n-1]) Heap-size = Heap-size -1 i=1 1 2 3 8 10 4 5 6 7 4 7 9 3 8 10 2 14 16 FixHeap(A,1) i=1 10 2 3 8 9 4 5 6 7 4 7 1 3 8 10 2 14 16 E cosi via …… Algoritmi e strutture Dati - Lezione 7