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

Documenti analoghi
Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

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

heap concetti ed applicazioni

Spesso sono definite anche le seguenti operazioni:

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

Heap e Code di Priorità

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

Heap e code di priorità

Alberi binari di ricerca

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

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

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Problemi di ordinamento

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

ADT albero binario completo

Alberi binari e alberi binari di ricerca

Algoritmi e Strutture Dati. HeapSort

Alberi binari e alberi binari di ricerca

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

lezione 9 min-heap binario Heap e Alberi posizionali generali

Alberi binari e alberi binari di ricerca

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Code a priorità. Progettazione di Algoritmi Matricole congrue a 1. Docente: Annalisa De Bonis

Alberi binari di ricerca

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

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

Alberi binari (radicati e ordinati) della radice Il padre del nodo 5 e del nodo 3

Algoritmi e Strutture Dati

Implementazione ADT: Alberi

ADT Coda con priorità

Algoritmi e Strutture Dati. HeapSort

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

Alberi. Albero binario. Un albero binario è un albero (ordinato) in cui ciascun nodo può avere al massimo due figli (figlio destro e figlio sinistro)

Algoritmi e Strutture Dati. Strutture dati speciali

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

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

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

Università degli Studi di L Aquila Facoltà di Scienze M.F.N. Corso di Laurea in Informatica. Modulo di Laboratorio di Algoritmi e Strutture Dati

Alberi binari: definizione e alcune proprietà

Algoritmi e Strutture Dati. Strutture dati speciali

Algoritmi e Strutture di Dati

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

Algoritmi di ordinamento: Array e ricorsione

ALBERI : introduzione SOMMARIO ALBERI ALBERI. ALBERI: introduzione ALBERI BINARI: introduzione VISITE RICORSIVE DI ALBERI

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

Strutture dati Alberi binari

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

Alberi Binario in Java

Struttura dati Dizionario

Algoritmi e Strutture di Dati

Esercitazione 4 Heap

Alberi ed Alberi Binari

Corso: Strutture Dati Docente: Annalisa De Bonis

Esercitazione 5 Alberi Binari di Ricerca

Heap, heap indiretti e code di priorità

Alberi ed Alberi Binari di Ricerca

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

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

Organigramma Gerarchia. (Tree) Nessuna persona può avere più di un superiore Ogni persona può essere superiore di altre

Algoritmi e Strutture Dati

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

Esercizio. Strutture Dati

Lezione 15 programmazione in Java. Nicola Drago Dipartimento di Informatica Università di Verona

Alberi. Alberi: definizioni. Alberi Binari. Esercizi su alberi binari: metodi ricorsivi. Struttura dati per alberi generici. ASD-L - Luca Tesei

Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

Implementazione dell albero binario in linguaggio C++

Algoritmi e strutture dati

Lezione 7 Alberi binari: visite e alberi di ricerca

Esercitazione 3. Heapsort

Alberi Binari di Ricerca

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

Dati e Algoritmi I (Pietracaprina) Esercizi su Priority Queue e Heap

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

Laboratorio 26 Aprile 2012

Algoritmi e Strutture Dati

Fondamenti teorici e programmazione

Informatica 3. LEZIONE 17: Alberi generici. Modulo 1: Definizione e ADT Modulo 2: Implementazione Modulo 3: Alberi e classi di equivalenza

Esercizi su programmazione ricorsiva 3

Alberi di ricerca. Dizionari. Definizione. Alberi binari di ricerca (BST = binary search tree) Algoritmi e Strutture Dati

d. Cancellazione del valore 5 e. Inserimento del valore 1

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Informatica 3. Informatica 3. LEZIONE 14: Alberi binari: introduzione. Lezione 14 - Modulo 1. Definizioni. Introduzione. Definizioni e proprietà

Informatica 3. Informatica 3. LEZIONE 17: Alberi generici. Lezione 17 - Modulo 1. Introduzione. ADT dell albero generico.

Lezione 12 Tabelle Hash

Alberi binari. Alberi Albero binario Heap tree

Per semplicità eliminiamo le ripetizioni nell'albero.

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Algoritmi e Strutture Dati. Capitolo 6 Il problema del dizionario

Albero in cui ogni nodo ha al più due figli. I figli di un nodo costituiscono una coppia ordinata

Il TDA BinaryTree. Albero Binario. Albero sintattico. Applicazioni. Albero delle decisioni binario. Albero binario di ricerca

Algoritmi e Strutture Dati. Lezione 3

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Strutture dati per insiemi disgiunti

ALBERI. Angelo Di Iorio Università di Bologna

Alberi Binari Alberi Binari

Algoritmi di ordinamento

Esercitazione 8. Corso di Tecniche di programmazione. Laurea in Ingegneria Informatica

Transcript:

Heap

Un heap binario è un albero binario con le seguenti caratteristiche: È quasi completo: tutti i livelli, tranna al più l ultimo sono completi e le foglie dell ultimo livello sono tutte adossate a sinistra.

Heap Un heap è un albero binario con le seguenti caratteristiche: È quasi completo: tutti i livelli, tranne al più l ultimo sono completi e le foglie dell ultimo livello sono tutte addossate a sinistra. Ad ogni nodo è associato un valore Tutti i valori presenti nei nodi nell albero costituiscono un insieme totalmente ordinato Per ogni nodo, il valore contenuto nel padre del nodo è minore o uguale di quello contenuto nel nodo stesso (minheap) Per ogni nodo, il valore contenuto nel padre del nodo è maggiore o uguale di quello contenuto nel nodo stesso (max-heap)

Min-heap: esempio 1 4 10 9 8 17 13 11 12 14

Min-heap: proprietà L elemento più piccolo viene memorizzato nella radice 1 4 10 9 8 17 13 11 12 14

Min-heap: proprietà Tutti i valori dei nodi presenti nel sottoalbero di un nodo (u) sono maggiori o uguali del valore del nodo u 1 4 10 9 8 17 13 11 12 14

Min-heap: proprietà Tutte le foglie hanno profondità h o h-1 Tutti i nodi interni hanno grado 2, eccetto al più uno 1 4 10 9 8 17 13 11 12 14

Min-heap: proprietà Se h è il livello massimo delle foglie allora ci sono esattamente 2 h -1 nodi di livello minore di h 1 4 10 9 8 17 13 11 12 14

Min-heap: proprietà La quasi completezza garantisce che l altezza di un heap con n nodi `e (log2 n) 1 4 10 9 8 17 13 11 12 14

Min-heap: implementazione Uno heap può essere rappresentato con un array A nel quale: Il primo elemento dell array contiene la radice Per ogni nodo contenuto in posizione i: il figlio sinistro è contenuto in posizione 2*i il figlio destro è contenuto in posizione 2*i + 1 Il padre è contenuto in posizione i/2

Min-heap: implementazione 3 4 10 9 8 17 13 11 12 14 Il primo elemento dell array contiene la radice Per ogni nodo contenuto in posizione i: il figlio sinistro è contenuto in posizione 2*i il figlio destro è contenuto in posizione 2*i + 1 Il padre è contenuto in posizione i/2 1 2 3 4 5 6 7 8 9 10

Min-heap: implementazione 3 4 10 9 8 17 13 11 12 14 Il primo elemento dell array contiene la radice Per ogni nodo contenuto in posizione i: il figlio sinistro è contenuto in posizione 2*i il figlio destro è contenuto in posizione 2*i + 1 Il padre è contenuto in posizione i/2 3 4 10 9 1 2 3 4 8 17 13 11 5 6 7 8 12 14 9 10

Esercizio Costruire l albero binario a partire dalla rappresentazione proposta in questo heap: 1 5 9 6 8 13 12 11 18 10 1 2 3 4 5 6 7 8 9 10

Code con priorità Struttura di dati che serve a mantenere un insieme S di elementi, ciascuno con un valore associato di priorità

Code con priorità Struttura di dati che serve a mantenere un insieme S di elementi, ciascuno con un valore associato di priorità public class PriorityItem<E,P extends Comparable> { private P priority; private E value; private int position; }

public class PriorityQueue<E, P extends Comparable> { private int capacity; private int heapsize; private PriorityItem<E,P>[] heap; public PriorityQueue(int capacity) { this.capacity = capacity; heapsize = 0; heap = new PriorityItem[this.capacity +1]; }

public E getmin() { if (heapsize == 0){ throw new EmptyPriorityQueueException(); } return heap[1].getvalue(); }

Min-heap: Inserimento Si inserisce un nuovo elemento come foglia posta a destra dell ultima foglia, cioè l albero viene completato per livelli. La nuova foglia viene poi sistemata nella posizione corretta del cammino che porta dalla sua posizione alla root.

3 4 10 9 8 17 13 11 12 14

3 4 10 9 8 17 13 11 12 14 5

3 4 10 9 8 17 13 11 12 14 5

3 4 10 9 5 17 13 11 12 14 8

private void swap(int i, int j){ PriorityItem tmp = heap[i]; heap[i] = heap[j]; heap[j] = tmp; heap[i].setposition(i); heap[j].setposition(j); }

public PriorityItem<E,P> insert(e item, P priority){ if (heapsize == capacity ){ throw new FullPriorityQueueException(); } heapsize = heapsize +1; heap[heapsize] = new PriorityItem<E,P>(priority, item, heapsize); int i = heapsize; while ( (i>1) && (heap[i].getpriority().compareto(heap[i/2].getpriority()) < 0) ){ swap(i,i/2); i = i/2; } return heap[i]; }

Min-heap: decrease priority Diminuisce la priorità di un dato elemento portandola ad un valore dato.

public void decrease(priorityitem<e,p> x, P priority){ if (priority.compareto(x.getpriority()) > 0){ throw new WrongPriorityException(); } x.setpriority(priority); int i = x.getposition(); while ( (i>1) && (heap[i].getpriority().compareto(heap[i/2].getpriority())<0)) { swap(i,i/2); i = i/2; } }

public void decrease(priorityitem<e,p> x, P priority){ if (priority.compareto(x.getpriority()) > 0){ throw new WrongPriorityException(); } x.setpriority(priority); int i = x.getposition(); while ( (i>1) && (heap[i].getpriority().compareto( heap[i/2].getpriority())<0)) { swap(i,i/2); i = i/2; } }

Min-heap: rimuovi minimo Si elimina l ultima foglia inserita e si salva il suo valore e la sua chiave nella radice Si ripristina la proprietà del min-heap (usando la procedura minheaprestore)

public E deletemin(){ if (heapsize == 0 ){ throw new EmptyPriorityQueueException(); } E minitem = heap[1].getvalue(); swap(1,heapsize); heapsize = heapsize-1; minheaprestore(1); return minitem; }

private void minheaprestore(int i){ int positionminpriority = i; int positionleftson = i*2; int positionrightson = i*2+1; if ((positionleftson <= heapsize) && (heap[positionleftson].getpriority().compareto (heap[positionminpriority].getpriority())<0)){ positionminpriority = positionleftson; } if ((positionrightson <= heapsize) && (heap[positionrightson].getpriority().compareto (heap[positionminpriority].getpriority())<0)){ positionminpriority = positionrightson; } if (i = positionminpriority){ swap(i,positionminpriority); minheaprestore(positionminpriority); } }

Esercizi Modificare il codice del min-heap in modo tale da implementare un max heap Modificare il codice del min-heap in modo tale che la radice dell albero sia memorizzata nella posizione di indice 0 dell array.

Bibliografia http://disi.unitn.it/~montreso/asd/lucidi/10- heapmfset-up.pdf http://www.cs.unicam.it/merelli/algoritmi06/[05] heap.pdf http://www.dsi.unive.it/~labasd/lezioni/lezione09/ lezione9.pdf