Algoritmi e Strutture Dati

Documenti analoghi
Algoritmi e Strutture Dati

Problemi di ordinamento

In questa lezione. Code di priorità. [CLRS01] cap. 6 da pag. 114 a pag Prof. E. Fachini - Intr. Alg. lunedì 17 settembre 2012

Albero binario: Ogni nodo ha zero, uno, o due successori (ordinati)

ADT Coda con priorità

Code a priorità Una coda a priorità è una struttura dati astratta che permette di rappresentare un insieme di elementi su cui è definita una

Dato un insieme S di n elementi totalmente ordinato, l'algoritmo di ordinamento detto HeapSort ha le seguenti caratteristiche:

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

Heap, heapsort e code a priorità. Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino

In questa lezione. Costruire un max-heap. [CLRS01] cap. 6 par Prof. E. Fachini - Intr. Alg.

Algoritmi (9 CFU) (A.A ) Heap e Algoritmo HeapSort. Prof. V. Cutello Algoritmi 1

Gli heap. Sommario. Algoritmi e Programmazione Avanzata. Fulvio CORNO - Matteo SONZA REORDA Dip. Automatica e Informatica Politecnico di Torino

Esercitazione 3. Heapsort

In questa lezione. Heapsort. ordinamento con complessità, nel caso peggiore, O(nlogn) [CLRS01] cap. 6 da pag. 106 a pag. 114

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

Heap e code di priorità

Algoritmi e Strutture di Dati

Heap Ordinamento e code di priorità. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 9

Un heap binario è un albero binario con le seguenti caratteristiche:

Introduzione agli algoritmi Prova di esame del 19/9/2016 Prof.sse E. Fachini - R. Petreschi. Parte prima

ALGORITMI E STRUTTURE DATI

Algoritmi e Strutture Dati. HeapSort

Algoritmi e Strutture Dati. HeapSort

Heap e Code di Priorità

Università degli Studi di Camerino Laurea in Informatica Prima Prova Parziale del corso di Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

heap heap heap? max- e min-heap concetti ed applicazioni heap = catasta condizione di heap non è una struttura ordinata

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Algoritmi di ordinamento: Array e ricorsione

Algoritmi e Strutture Dati

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Introduzione. Heap-binomiali: un heap binomiale è un insieme di alberi binomiali.

Alberi binari: definizione e alcune proprietà

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

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4

Code con priorità. Moreno Marzolla Dip. di Scienze dell'informazione Università di Bologna.

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

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

Algoritmi e Strutture Dati

Code a priorità (Heap) Definizione Heapify (mantenimento coda a priorità) Costruire un Heap Insert, Maximum e Extract-Max

ADT Dizionario. Ordered search table. Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D:

Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

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

Algoritmi e strutture dati

Algoritmi e Strutture Dati

Alberi binari di ricerca

Alberi Binari di Ricerca. Vittorio Maniezzo Università di Bologna

Alberi Binari di Ricerca

lezione 9 min-heap binario Heap e Alberi posizionali generali

Heap binomiali. Oltre alle precedenti operazioni fondamentali degli heap riunibili, sugli heap binomiali definiremo anche le due ulteriori operazioni:

Algoritmi e Strutture Dati

ESERCIZI SUGLI HEAP BINOMIALI (CAPITOLO 20) Catalano Pietro 56/100592

Algoritmi e Strutture Dati. Capitolo 6 Il problema del dizionario

Laboratorio di Algoritmi e Strutture Dati

Alberi. Se x è il genitore di y, allora y è un figlio di x. Un albero binario è un albero in cui ogni nodo ha al massimo due figli.

Algoritmi e Strutture Dati

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

QuickSort Università degli Studi di Milano

Il problema dello zaino

Multi-way search trees

Alberi binari e alberi binari di ricerca

Alberi binari e alberi binari di ricerca

Algoritmi e Strutture Dati

Esercizi parte 3. La classe ArrayBinTree dovra implementare, tra le altre, l operazione seguente: padre: dato un nodo, restituire l indice del padre.

Algoritmi e strutture dati 16 Dicembre 2004 Canali A L e M Z Cognome Nome Matricola

Esercizi su ABR. Prof. E. Fachini - Intr. Alg.!1

Algoritmi e Strutture Dati

Esercizi su alberi binari

Strutture dati per insiemi disgiunti

ESERCIZI DI ALGORITMI E STRUTTURE DATI 2 Parte 2. Livio Colussi Dipartimento di Matematica Pura ed Applicata Università di Padova

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree

Algoritmi e strutture dati

Alberi binari e alberi binari di ricerca

Algoritmi e Strutture Dati

INTRODUZIONE AGLI ALGORITMI 25 Giugno 2018 Prof.ssa Fachini/Prof.ssa Petreschi I PARTE

Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4

Visualizzazione di dati

Problem Set 3 docente: Luciano Gualà

Lezione 7 Alberi binari: visite e alberi di ricerca

Esercizi Capitolo 6 - Alberi binari di ricerca

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

In questa lezione Alberi binari di ricerca: la cancellazione

Algoritmi e Strutture Dati

In questa lezione Strutture dati elementari: Pila Coda Loro uso nella costruzione di algoritmi.

Transcript:

Heap Maria Rita Di Berardini, Emanuela Merelli 1 1 Dipartimento di Matematica e Informatica Università di Camerino 6 novembre 2008

Heap binari: definizione Un heap binario è una albero binario quasi completo che soddisfa una delle seguenti proprietà: 1 proprietà del max-heap: il valore associato a ciascun nodo u è maggiore o uguale al valore assiciato ai suoi figli (in questo caso l heap binario viene chiamato max-heap) 2 proprietà del min-heap: il valore associato a ciascun nodo u è minore o uguale al valore assiciato ai suoi figli (min-heap) Un albero binario si dice quasi completo se tutti i livelli, tranne eventualmente l ultimo, sono completi; nell ultimo livello possono mancare delle foglie consecutive a partire dall ultima foglia a destra

Heap binari: esempi max-heap 16 14 10 8 7 2 4 1 9 3 1 2 3 8 14 4 7 9 10 16 min-heap

Altezza di un heap binario La quasi completezza garantisce che l altezza h di un heap con n nodi è logaritmica nel numero di nodi, i.e h = Θ(log 2 n) Le operazioni fondamentali sugli heap rihciedono un tempo che è al più proporzionale alla sua altezza e, quindi, vengono eseguite in un tempo O(log 2 n)

Heap Heap binari: definizione Un heap binario può anche essere rappresentato come un array 1 16 2 3 14 10 4 5 6 7 8 7 9 3 8 9 10 2 4 1 A 16 14 10 8 7 9 3 2 4 1

Heap Heap binari: definizione Un array che rappresenta un heap binario è un oggetto con due attributi: length[a] è il numero di elementi (la dimensione) dell array heap-size[a] è il numero di elementi dell heap memorizzati nell array La radice dell albero è A[1] (si trova in posizione 1) Se i è l indice di un dato nodo, gli indici del padre parent[i], del figlio sinistro left[i] e del figlio destro right[i] sono i/2, 2i e 2i + 1

Max-heap e min-heap Proprietà del max-heap: in un max-heap ogni nodo i diverso dalla radice à tale che A[parent[i]] A[i] Nota 1: l elemento più grande di un max-heap è memorizzato nella radice Nota 2: un sottoalbero di un nodo u contiene nodi il cui valore non è mai maggiore del valore del nodo u

Max-heap e min-heap Proprietà del min-heap: in un min-heap ogni nodo i diverso dalla radice è tale che A[parent[i]] A[i] Nota 1: l elemento più piccolo di un min-heap viene memorizzato nella radice Nota 2: un sottoalbero di un nodo u contiene nodi il cui valore non è mai minore del valore del nodo u

Code di Priorità (Priority Queues) Un coda di priorità è una struttura dati che serve per mantenere un insieme S di elementi ciascun con un valore detto chiave che rappresenta la sua priorità Analogamente agli heap, esistono due tipi di code di priorità: code di max-priorità e code di min-priorità Una coda di max-priorità supporta le seguenti operazioni: 1 Insert(S, x) inserisce x nell insieme S 2 Maximum(S) restituisce l elemento di S con chiave più grande 3 Extract-Max(S) elimina e restituisce l elemento di S con chiave più grande 4 Increase-Key(S, x, k) aumenta il valore della chiave di x al nuovo valore k (qui assumiamo k dell attuale valore della chiave di x)

Code di Priorità (Priority Queues) Applicazioni di una coda di max-priorità: programmare i lavori su un computer condiviso (Job-Scheduling) La coda di max-priorità tiene traccia dei lavori da svolgere e delle relative priorità Quando un lavoro è ultimato o interrotto viene selezionato, mediante Extract-Max, il lavoro con priotità più alta tra quelli in attesa Un nuovo lavoro puù essere aggiunto in qualsiasi momento mediante una Insert

Code di Priorità (Priority Queues) In alternativa, una coda di min-priorità supporta le seguenti operazioni: 1 Insert(S, x) inserisce x nell insieme S 2 Minimum(S) restituisce l elemento di S con chiave minima 3 Extract-Min(S) elimina e restituisce l elemento di S con chiave minima 4 Decrease-Key(S, x, k) decrementa il valore della chiave di x al nuovo valore k (qui assumiamo k dell attuale valore della chiave di x)

Code di Priorità (Priority Queues) Applicazioni di una coda di min-priorità: simulatore controllato di eventi (event-driven simualtion) Gli elementi della coda sono gli eventi da simulare; ad ognuno di essi è associata una chiave che rappresenta il tempo in cui l evento si verifica Gli eventi devono essere simulati secondo l ordine dei loro tempi, questo perchè un evento può generare altri eventi Ad ogni passaggio il programma seleziona l evento da simulare mediante una Etract-Min Ogni nuovo evento viene inserito in coda tramite una Insert

inserimento restituzione del massimo estrazione del massimo incremento di una chiave Vediamo come è possibile implementare una coda di max-priorità tramite un max-heap

Inserimento Heap binari: definizione inserimento restituzione del massimo estrazione del massimo incremento di una chiave Insert(A, 15) A 1 2 3 4 5 6 7 8 9 10 16 14 10 8 7 9 3 2 4 1 1 2 3 4 5 6 7 8 9 10 i=11 A 16 14 10 8 7 9 3 2 4 1 15 A[parent[i]] < A[i] 1 2 3 4 i=5 6 7 8 9 10 11 A 16 14 10 8 15 9 3 2 4 1 7 A[parent[i]] < A[i] 1 i=2 3 4 5 6 7 8 9 10 11 A 16 15 10 8 14 9 3 2 4 1 7 A[parent[i]] A[i]

Max-Heap-Insert(A, x) inserimento restituzione del massimo estrazione del massimo incremento di una chiave Max-Heap-Insert(A, x) heap-size[a] heap-size[a] + 1 aumentiamo la dimensione dell heap i heap-size[a] A[i] x while i > 1 or A[parent[i]] < A[i] do scambia A[i] A[parent[i]] i parent[i] Il numero di scambi è pari al più all altezza dello heap, quindi Max-Heap-Insert viene eseguita in un tempo O(log 2 n)

Max-Heap-Insert(A, x) inserimento restituzione del massimo estrazione del massimo incremento di una chiave 16 16 14 10 14 10 8 7 9 3 8 i = 5 15 9 3 2 4 1 15 i = 11 2 4 1 7 (a) (b) 16 16 i = 2 15 10 15 10 8 14 9 3 8 14 9 3 2 4 1 7 2 4 1 7 (c)

Restituzione del massimo inserimento restituzione del massimo estrazione del massimo incremento di una chiave La seguente procedura implementa l operazione Maximum in un tempo costante (Θ(1)) Heap-Maximum(A) return A[1]

Estrazione del massimo inserimento restituzione del massimo estrazione del massimo incremento di una chiave 16 14 10 8 7 9 3 2 4 1 max 16 1 14 10 8 7 9 3 2 4 1 1 Non è un heap 14 10 Max-Heapify(A,1) 8 7 9 3 2 4

Max-Heapify(A, i) Heap binari: definizione inserimento restituzione del massimo estrazione del massimo incremento di una chiave È un importante subroutine per manipolare max-heap Input: un heap A e un indice i Max-Heapify(A, i) viene chiamata quando i sotto-alberi binari con radice left[i] e right[i] sono max-heap, ma A[i] è più piccolo dei suoi figli, violando così la proprietà del max-heap Idea: far scendere il valore di A[i] nel max-heap in modo da ripristinare la proprietà desiderata

Max-Heapify(A, i) Heap binari: definizione inserimento restituzione del massimo estrazione del massimo incremento di una chiave i Heaps A B i 2i 2i+1 4i 4i+3 8i 8i+7? Heaps A B i Heap Facciamo scendere il nodo i nell albero fino a trovare la sua posizione

Max-Heapify(A, i) Heap binari: definizione inserimento restituzione del massimo estrazione del massimo incremento di una chiave 1 14 10 14 1 10 8 7 9 3 8 7 9 3 2 4 max(14, 10) = 14 max(8, 7) = 8 2 4 14 8 10 14 8 10 1 7 9 3 4 7 9 3 2 4 max(2, 4) = 4 2 1

Max-Heapify(A, i) Heap binari: definizione inserimento restituzione del massimo estrazione del massimo incremento di una chiave Max-Heapify(A, i) l left[i] r right[i] if l heap-size[a] and A[l] > A[i] then max l else max i if r heap-size[a] and A[r] > A[max] then max r if max i then scambia A[i] A[max] Max-Heapify(A, max)

Max-Heapify(A, i) Heap binari: definizione inserimento restituzione del massimo estrazione del massimo incremento di una chiave Max-Heapfy( 1 ) 14 14 10 Max-Heapfy( 1 ) 10 8 7 9 3 8 7 9 3 2 4 2 4 14 8 10 14 8 10 Max-Heapfy( 1 ) 7 9 3 4 7 9 3 2 4 2 1

inserimento restituzione del massimo estrazione del massimo incremento di una chiave Costo computazionale di Max-Heapify(A, i) Il costo di Max-Heapify in un (sotto)albero di dimensione n è pari: al tempo costante Θ(1) necessario per stabilire il massimo fra gli elementi A[i], A[left(i)] e A[right(i)] più il tempo per eseguire Max-Heapify in un sottoalbero con radice uno dei figli di i La dimensione di ciascun sottoalbero non supera 2n/3 Il tempo di esecuzione di Max-Heapify può essere espresso dalla seguente ricorrenza T (n) T (2n/3) + Θ(1) Per il teorema master, la soluzione di questa ricorrenza è O(log 2 n)

Esercizio Heap binari: definizione inserimento restituzione del massimo estrazione del massimo incremento di una chiave Risolvere la seguente ricorrenza usando il teorema dell esperto { c + T 1 (2n/3) se n > 1 T 1 (n) = 1 se n = 1 In questo caso, il numero e la dimensione dei sottoproblemi sono pari ad a = 1 e b = 3/2 (n/b = 2/3n implica b = 3/2). Inoltre, log b a = log 3/2 1 = 0 e f (n) = c = Θ(1) = Θ(n 0 ) = Θ(n log b a ) Per il caso 2 del teorema dell esperto abbiamo che T 1 (n) = Θ(n log b a log 2 n) = Θ(log 2 n)

Estrazione del massimo inserimento restituzione del massimo estrazione del massimo incremento di una chiave Heap-Extract-Max(A) if heap-size[a] < 1 then error underflow dell heap max A[1] A[1] A[heap-size[A]] heap-size[a] heap-size[a] 1 Max-Heapify(A, 1) return max Il costo computazionale è dato chiaramente dal costo della procedura Max-Heapify, ossia O(log 2 n)

Incremento di una chiave inserimento restituzione del massimo estrazione del massimo incremento di una chiave Increase-Key(A, 9, 15) A 16 14 10 8 7 9 3 2 4 1 A 1 2 3 4 5 6 7 8 i=9 10 16 14 10 8 7 9 3 2 15 1 A[parent[i]] < A[i] A 1 2 3 i=4 5 6 7 8 9 10 16 14 10 15 7 9 3 2 8 1 A[parent[i]] < A[i] A 1 i=2 3 4 5 6 7 8 9 10 16 15 10 14 7 9 3 2 8 1 A[parent[i]] A[i]

Heap-Increase-Key(A, i, key) inserimento restituzione del massimo estrazione del massimo incremento di una chiave È molto simile alla Max-Heap-Insert Heap-Increase-Key(A, i, key) if key < A[i] then error la nuova chiave è più piccola di quella corrente A[i] key while i > 1 or A[parent[i]] < A[i] do scambia A[i] A[parent[i]] i parent[i] O(log 2 n)

Incremento di una chiave inserimento restituzione del massimo estrazione del massimo incremento di una chiave 16 16 14 10 14 10 8 7 9 3 8 7 9 3 2 4 1 2 15 1 (a) 16 (b) 16 14 10 15 10 15 7 9 3 14 7 9 3 2 8 1 2 8 1 (c) (d)

Costruzione di un heap Possiamo usare la procedura Max-Heapify dal basso verso l alto (in maniera bottom-up) per convertire un array A[1... n] (non heapizzato ) in un heap In un albero che rappresenta un heap di n elementi le foglie sono i nodi con indici n/2 + 1, n/2 + 2,..., n Ciascuno di essi è un heap di un elemento da cui cominciare

Costruzione di un heap 4 1 4 1 1 2 3 3 2 4 7 5 9 6 10 7 1 2 3 3 2 4 7 5 9 6 10 7 14 8 8 9 16 10 14 8 8 9 16 10 (a) 4 1 4 1 1 2 3 3 2 4 16 5 9 6 10 7 1 2 3 3 14 4 16 5 9 6 10 7 14 8 8 9 7 10 (b) 2 8 8 9 7 10 (c)

Costruzione di un heap 4 1 4 1 1 2 10 3 14 4 16 5 9 6 3 7 16 2 10 3 14 4 7 5 9 6 3 7 2 8 8 9 7 10 (d) 2 8 8 9 1 10 (e) 16 1 14 2 10 3 8 4 7 5 9 6 3 7 2 8 4 9 1 10

Build-Max-Heap(A) Build-Max-Heap(A) heap-size[a] length[a] for i length[a]/2 downto 1 do Max-Heapify(A, i) Il tempo di esecuzione di ogni chiamata di Max-Heapify è (al più) O(log 2 n). Eseguiamo length[a]/2 = O(n) chiamate di Max-Heapify. Quindi, il tempo di esecuzione è O(n log 2 n)

Build-Max-Heap(A) Il tempo di esecuzione di ogni chiamata di Max-Heapify è O(n log 2 n) Questo limite superiore, sebbene corretto, non è asintoticamente stretto Possiamo fare di meglio osservando che il tempo di esecuzione di Max-Heapify varia al variare dell altezza del nodo nell heap e che le altezze della maggiorparte dei nodi sono piccole Queste considerazioni portano a dimostrare che in il costo di ogni chiamata di Max-Heapify è O(n)

Ordinamento di un heap A 1 2 3 4 5 6 7 8 9 10 16 14 10 8 7 9 3 2 4 1 heap-size l elemento massimo è in posizione 1 A 1 2 3 4 5 6 7 8 9 10 1 14 10 8 7 9 3 2 4 16 heapizziamo questa porzione di vettore A 1 2 3 4 5 6 7 8 9 10 14 8 10 4 7 9 3 2 1 16 ed... iteriamo

Ordinamento di un heap 1 2 3 4 5 6 7 8 9 10 A 14 8 10 24 7 9 3 2 41 16 il secondo elemento più grade è in posizione 1 A 1 2 3 4 5 6 7 8 9 10 14 1 8 10 24 7 9 3 2 144 16 A heapizziamo questa porzione di vettore 1 2 3 4 5 6 7 8 9 10 14 10 8 10 9 24 7 91 3 2 144 16 iterando n-1 volte otteniamo un vettore ordinato

Heapsort(A) Heapsort(A) Build-Max-Heap(A) for i length[a] downto 2 do scambia A[1] A[i] heap-size[a] heap-size[a] 1 Max-Heapify(A, 1) La chiamata di Build-Max-Heap impiega O(n) e ciascuna delle n 1 di Max-Heapify impiega O(log 2 n) La procedura Heapsort impiega un tempo O(n log 2 n)