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]

Slides:



Advertisements
Presentazioni simili
Strutture dati per insiemi disgiunti
Advertisements

Algoritmi e Strutture Dati
INFORMATICA Algoritmi fondamentali
1 MeDeC - Centro Demoscopico Metropolitano Provincia di Bologna - per Valutazione su alcuni servizi erogati nel.
SCOMPOSIZIONE DI UN NUMERO IN FATTORI PRIMI
Unità G3 Algoritmi notevoli. Ordinamento Un insieme di dati {a0, a1, a2, …, an} si dice ordinato in ordine crescente se a0 a1 a2 a3 … an I dati sono generalmente.
RB-alberi (Red-Black trees)
Programmazione dinamica
Code a priorità (Heap) Definizione
Alberi binari di ricerca
Code con priorità Ordinamento
Heap binomiali.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
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.
Algoritmi e Strutture Dati
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 Stesso approccio.
STRUTTURE DATI e LABORATORIO II ESERCITAZIONE N°13 Heap massimo.
Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 06/03/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI.
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
Algoritmo di Ford-Fulkerson
Algoritmi e strutture Dati - Lezione 7
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
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.
Canale A. Prof.Ciapetti AA2003/04
Algoritmi e Strutture Dati (Mod. A)
Algoritmi e Strutture Dati Valutazione del tempo di esecuzione degli algoritmi.
Algoritmi e Strutture Dati
Algoritmi e strutture dati
Esistono 10 tipi di persone al mondo: Quelli che conoscono il codice binario & Quelli che non lo conoscono.
Algoritmi e Strutture Dati IV. Heap e Code di Priorità
Algoritmi e Strutture Dati III. Algoritmi di Ordinamento
Rappresentazione binaria dei numeri interi senza segno.
MP/RU 1 Dicembre 2011 ALLEGATO TECNICO Evoluzioni organizzative: organico a tendere - ricollocazioni - Orari TSC.
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,
Cos’è un problema?.
Analisi di Immagini e Dati Biologici
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.
ORDINE DI CHIAMATA a 1minuto e 2 minuti PRINCIPALI TEMPI DELLA COMPETIZIONE ORDINE DI CHIAMATA a 1minuto e 2 minuti PRINCIPALI TEMPI DELLA COMPETIZIONE.
Ordinamento dell’array
ISTITUTO COMPRENSIVO “G. BATTAGLINI” MARTINA FRANCA (TA)
Strutture dati per insiemi disgiunti
Radix-Sort(A,d) // A[i] = cd...c2c1
Merge-Sort(A,p,r) if p < r q = (p+r)/2 Merge-Sort(A,p,q)
Vedremo in seguito che (n log n) è un limite stretto per il problema dellordinamento. Per ora ci limitiamo a dimostrare che: La complessità nel caso pessimo.
Cerchiamo di rispondere alla seconda domanda 2)La soluzione trovata con lalgoritmo goloso è ottima o esistono anche soluzioni con più di quattro attività?
Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo L’esplorazione inizia dalla cella h(k,0) = h'(k) e continua.
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.
Un trucchetto di Moltiplicazione per il calcolo mentale
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.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Progressioni aritmetiche descrizione elementare
Cammini minimi da un sorgente
Sistemi e Tecnologie Informatiche
Valutare la difficoltà dei problemi
1/32 Algoritmi e Strutture Dati HEAP Anno accademico
Complessità del problema Se non facciamo ipotesi sul tipo degli elementi della sequenza le uniche operazioni permesse sono confronti e assegnazioni. Problema.
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.
Alberi Alberi radicati : alberi liberi in cui un vertice è stato scelto come radice. Alberi liberi : grafi non orientati connessi e senza cicli. Alberi.
Capitolo 8 Code con priorità Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
Codici prefissi Un codice prefisso è un codice in cui nessuna parola codice è prefisso (parte iniziale) di un’altra Ogni codice a lunghezza fissa è ovviamente.
Algoritmi e Strutture Dati HeapSort. Select Sort: intuizioni L’algoritmo Select-Sort  scandisce tutti gli elementi dell’array a partire dall’ultimo elemento.
Transcript della presentazione:

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] A[  i / 2  ] è il padre di A[i]

a 10 a 11 a9a9 a 12 a2a2 a8a8 a4a4 a5a5 a6a6 a7a7 a3a3 a1a1 a1a1 a2a2 a3a3 a4a4 a5a5 a6a6 a7a7 a8a8 a9a9 a 10 a Albero binario quasi completo

“A[i] è maggiore o uguale di ogni suo discendente in A[1..n]” Proprietà di un heap (mucchio) Diciamo che A[1..n] è un (è ordinato a) max-heap se ogni elemento A[i] soddisfa la seguente proprietà: Per brevità indicheremo questa proprietà con H(i)

Un max-heap

Costruzione di un max-heap

Ordinamento dell’array

Max-Heapfy(A,i) l = 2i, r =2i+1 m = i if l  A.heapsize and A[l] > A[m] m = l if r  A.heapsize and A[r] > A[m] m = r if m  i t = A[i], A[i] = A[m], A[m] = t Max-Heapfy(A,m)

Build-Max-Heap (A) A.heapsize = A.length for i =  A.lenght/2  downto 1 Max-Heapfy(A,i)

Heap-Sort (A) Build-Max-Heap(A) for i = A.length downto 2 t = A[i], A[i] = A[1], A[1] = t A.heapsize = A.heapsize - 1 Max-Heapfy(A,1)

Abbiamo visto che la complessità nel caso pessimo di ogni algoritmo di ordinamento sul posto che confronta e scambia tra loro elementi consecutivi dell’array è  (n 2 ). Per ottenere algoritmi più efficienti dobbiamo quindi operare confronti e scambi tra elementi “distanti” dell’array. L’algoritmo Heap-Sort confronta elementi non consecutivi e possiamo quindi sperare che la sua complessità sia minore.

In effetti Heap-Sort richiede tempo O(n log n) per ordinare un array di n elementi (vedi Libro 6.2, 6.3, 6.4)

Implementazione di code con priorità Gli heap binari si possono usare, oltre che per ordinare un array, anche per implementare delle code con priorità. Le code con priorità sono delle strutture dati in cui è possibile immagazzinare degli oggetti x a cui è attribuita una priorità x.key ed estrarli uno alla volta in ordine di priorità.

Possono inoltre essere definite anche: Increase-Key(S,x,p): aumenta la priorità di x Change-Key(S,x,p): cambia la priorità di x Le operazioni fondamentali sulle code con priorità sono: Insert(S, x): aggiunge x alla coda S Maximum(S): ritorna x  S con x.key massima Extract-Max(S): toglie e ritorna x  S con x.key massima.

Heap-Maximum(A) // A è un max-heap if A.heapsize < 1 error “underflow” else return A[1] Heap-Extract-Max(A) // A è un max-heap if A.heapsize < 1 error “underflow” else max = A[1] A[1] = A[A.heapsize] A.heapsize = A.heapsize - 1 Max-Heapfy(A,1) return max

Heap-Insert

“A[i] è maggiore o uguale di ogni suo discendente” usa la proprietà simmetrica: Per realizzare Heap-Insert e Heap-Increase-Key ci serve una Max-Heapfy diversa che invece della proprietà: “A[i] è minore o uguale di ogni suo ascendente” entrambe, se vere per ogni elemento dell’array, ci assicurano l’ordinamento a max-heap di A.

Max-HeapfyR(A,i) // solo A[i] può non soddisfare la proprietà while i >1 and A[ ⌊ i/2 ⌋ ].key < A[i].key scambia A[ ⌊ i/2 ⌋ ] con A[i] // solo A[ ⌊ i/2 ⌋ ] può non soddisfarla i = ⌊ i/2 ⌋ La nuova versione Max-HeapfyR ricostruisce lo heap quando tutti gli elementi dell’array sono minori o uguali dei loro ascendenti tranne al più quello in posizione i.

Heap-Increase-Key(A,i,p) // A max-heap if p < A[i].key error “la nuova priorità è minore” else A[i].key = p Max-HeapfyR(A,i) Max-Heap-Insert(A,x) // A max-heap A.heapsize = A.heapsize+1 A[A.heapsize] = x Max-HeapfyR(A,A.heapsize)

Heap-Change-Key(A,i,p) // A max-heap if p < A[i].key A[i].key = p Max-Heapfy(A,i) else A[i].key = p Max-HeapfyR(A,i) Possiamo facilmente realizzare anche una Heap-Change-Key nel modo seguente: