heap concetti ed applicazioni

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

Heap e Code di Priorità

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

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

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

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

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

Problemi di ordinamento

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

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

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

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

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

Spesso sono definite anche le seguenti operazioni:

Algoritmi e Strutture di Dati

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Heap e code di priorità

Esercitazione 4 Heap

Esame di Algoritmi e Strutture Dati Corso di Laurea in Ingegneria Informatica Canali A-L, M-Z

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

Algoritmi e Strutture Dati. HeapSort

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

Algoritmi e Strutture Dati

Algoritmi e Strutture di Dati

Algoritmi e Strutture Dati. HeapSort

Algoritmi e Strutture Dati

Alberi ed Alberi Binari di Ricerca

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

ADT Coda con priorità

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

Esercitazione 3. Heapsort

Tipi di dato e Strutture dati elementari

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

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

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

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

lezione 9 min-heap binario Heap e Alberi posizionali generali

dizionari alberi bilanciati

Strutture dati Alberi binari

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

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

alberi tipo astratto, implementazione, algoritmi

Algoritmi di ordinamento

dizionari dizionari introduzione al bilanciamento dizionari/2 alberi bilanciati ! ADT che supportano le seguenti operazioni

Alberi ed Alberi Binari

Prova di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE

argomenti alberi terminologia tipo di dato astratto albero tipo astratto, implementazione, algoritmi es.: radice R con n sottoalberi radice

ADT albero binario completo

Argomenti della lezione. Tipo di dato astratto. Array. Tipo di dato Lista. Liste Implementazione di liste in Java Stack Code

Esercitazione 5 Alberi Binari di Ricerca

Algoritmi di ordinamento

Algoritmi e strutture dati

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

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

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

Alberi binari. Alberi Albero binario Heap tree

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

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

Implementazione ADT: Alberi

Esame di Algoritmi e Strutture Dati Corso di Laurea in Ingegneria Informatica Canali A-L, M-Z 28 giugno 2005 tempo a disposizione: 2 ore

Dati e Algoritmi 1: A. Pietracaprina. Priority Queue (II parte)

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

algoritmi e strutture di dati

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

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 e alberi binari di ricerca

Algoritmi e Strutture Dati. Lezione 4

Algoritmi e Strutture di Dati

Algoritmi e Strutture Dati

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

Alberi binari e alberi binari di ricerca

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Heap, heap indiretti e code di priorità

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

Informatica 3. Informatica 3. LEZIONE 23: Indicizzazione. Lezione 23 - Modulo 1. Indicizzazione. Introduzione. Indicizzazione:

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

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

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Alberi binari e alberi binari di ricerca

ricerca di un elemento, verifica dell appartenenza di un elemento

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

Fondamenti teorici e programmazione

Alberi binari di ricerca

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

Insert sort. Considero il primo elemento a 1. cerco il minimo tra gli elementi 3...N. scambio il minimo trovato con il primo e- lemento

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

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

Corso: Strutture Dati Docente: Annalisa De Bonis

Alberi di ricerca. Alberi binari di ricerca. F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)

Un esempio: l ADT Dizionario (mutabile) Definizione. Alberi binari di ricerca (BST = binary search tree) search(chiave k) -> elem

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

In questa lezione Alberi binari di ricerca

Alberi binari di ricerca

tipi di dato astratti

Alberi e alberi binari I Un albero è un caso particolare di grafo

Transcript:

heap concetti ed applicazioni

ADT coda di priorità operazioni getfirst restituisce l'elemento nella struttura con massima priorità deletefirst cancella l'elemento nella struttura con massima priorità insert inserisce nuovo elemento nella struttura giugno 2003 ASD - Heap 2

code di priorità la priorità è in genere espressa da un intero a priorità max corrisponde intero max o min numerose applicazioni sistemi operativi, algoritmi di scheduling, gestione di code ecc. implementazione più efficiente tramite heap giugno 2003 ASD - Heap 3

heap heap = catasta condizione di heap 1. albero binario perfettamente bilanciato ma non è un BST!! 2. tutte le foglie sono a sinistra 3. ogni nodo contiene una chiave (priorità) maggiore o eguale di quelle presenti negli eventuali figli non è una struttura ordinata le visite in ampiezza e in profondità non forniscono un ordinamento delle chiavi ogni sottoalbero è uno heap giugno 2003 ASD - Heap 4

heap? 89 67 68 89 67 68 66 65 66 67 66 65 66 1 66 66 5 4 64 1 2 3 4 5 6 89 67 67 67 67 66 65 67 67 67 67 1 giugno 2003 ASD - Heap 5

max- e min-heap la struttura definita è detta max-heap variante: min-heap ogni nodo contiene una chiave minore o eguale di quelle presenti negli eventuali figli 6 13 22 13 23 44 27 23 32 33 24 56 81 min-heap giugno 2003 ASD - Heap 6

operazioni su un (max-)heap insert chiave inserisce nuova chiave nello heap occorre mantenere la condizione di heap deletefirst cancella chiave con max priorità dallo heap occorre mantenere la condizione di heap getfirst restituisce la chiave con max priorità nello heap non modifica lo heap giugno 2003 ASD - Heap 7

rappresentazione degli heap tutte le rappresentazione usate per gli alberi binarie sono ammissibili rappresentazione collegata, eventualmente con puntatori figligenitore rappresentazione tramite array particolarmente efficiente giugno 2003 ASD - Heap 8

rappresentazione tramite array ogni nodo v è memorizzato in posizione p(v ) se v è la radice allora p(v )=0 se v è il figlio sinistro di u allora p(v )=2p(u )+1 se v è il figlio destro di u allora p(v )=2p(u )+2 1 43 89 67 68 66 65 21 5 66 67 4 64 89 67 68 66 65 66 67 1 43 21 5 4 64 giugno 2003 ASD - Heap 9 0 1 2 3 4 5 6 7 8 9 10 11 12

heap su array vantaggi grande efficienza in termini di spazio l occupazione può essere minima facilità di navigazione genitore i figli j j = 2i + 1, 2i + 2 figlio i genitore j j = (i 1) / 2 svantaggio implementazione statica possono essere necessari progressivi raddoppiamenti/dimezzamenti dell array di supporto giugno 2003 ASD - Heap 10

rappresentazione in Java public class Heap { public static final int DEFAULTCAPACITY = 50; protected int storage[], size; public Heap() { this(defaultcapacity); public Heap(int dim) { storage = new int[dim]; size = 0; // metodi giugno 2003 ASD - Heap 11

rappresentazione in Java/2 public boolean isleaf(int i) { return getleftindex(i) >= size; public boolean isroot(int i) { return i == 0; public boolean isempty() { return size == 0; public boolean isfull() { return size == storage.length; giugno 2003 ASD - Heap 12

rappresentazione in Java/3 private static int getleftindex(int i) { return 2 * i + 1; private static int getrightindex(int i) { return getleftindex(i) + 1; private static int getparentindex(int i) { return (i - 1) / 2; public String tostring() { // segue implementazione operazioni giugno 2003 ASD - Heap 13

algoritmi su heap operazioni getfirst insert deletefirst altri algoritmi Array2Heap conversione di un array in heap HeapSort ordinamento di un array sfruttando uno heap giugno 2003 ASD - Heap 14

getfirst l'elemento di priorità max è contenuto nella cella 0 dell array operazione di costo costante O(1) giugno 2003 ASD - Heap 15

insert 1. inserisci elemento alla fine dello heap 2. while (elemento non è radice) and (elemento > genitore(elemento)) 3. scambia elemento con genitore giugno 2003 ASD - Heap 16

insert/2 giugno 2003 ASD - Heap 17

insert/3 Algorithm insert(int k) { storage[size] = k; int i = size++; int j = getparentindex(i); while(!isroot(i)&&(storage[i]>storage[j])){ exchange(i, j); i = j; j = getparentindex(i); codice semplificato giugno 2003 ASD - Heap 18

deletefirst 1. sostituisci primo elemento con ultima foglia ed elimina ultima foglia 2. p = radice 3. while (p non è foglia) and (p < un figlio) 4. scambia p con il suo figlio maggiore giugno 2003 ASD - Heap 19

deletefirst/2 giugno 2003 ASD - Heap 20

deletefirst/3 public void deletefirst() { if(!isempty()) { storage[0] = storage[--size]; heapify(0); // ripristina heap giugno 2003 ASD - Heap 21

heapify operazione "di servizio" rende heap il sottoalbero avente radice nella cella di posto i attraverso una sequenza di scambi genitore figlio maggiore i due sottoalberi di i sono heap utile in deletefirst ed in altri contesti giugno 2003 ASD - Heap 22

heapify /codice Algorithm heapify(int i) { if(isleaf(i)) return; j = getmaxchildindex(i); if(storage[i] < storage[j]) { exchange(i, j); heapify(j); giugno 2003 ASD - Heap 23

costi proporzionali all altezza dello heap Θ(lg n ) sia per l inserimento sia per la cancellazione giugno 2003 ASD - Heap 24

heap e code di priorità una coda di priorità è un tipo astratto con le seguenti operazioni enqueue, inserimento in coda dequeue, estrazione dalla coda dell elemento avente priorità max la priorità è in genere espressa da un intero gli heap sono strutture di dati eccellenti per l implementazione di code di priorità giugno 2003 ASD - Heap 25

altre operazioni su heap Array2Heap dato un array di interi costruisce uno heap con quegli interi HeapSort dato un array di interi ordina l array in senso crescente giugno 2003 ASD - Heap 26

Array2Heap dato un array arr, lo trasforma in un array che rappresenta uno heap attraverso una opportuna permutazione degli elementi semplice algoritmo for(i = 1; i < arr.length; i++) insert(arr[i]); costo (sfruttando l approssimazione di Stirling del fattoriale): lnn! 1 n lgi lgn! ( n lnn n) ( n lgn) i = = = = Θ 1 ln2 ln2 giugno 2003 ASD - Heap 27

Array2Heap/2 l algoritmo di Floyd è invece basato sull idea di applicare l operazione heapify ad alberi binari in cui i figli della radice sono radici di heap vengono progressivamente resi heap (heapified) i sottoalberi aventi la radice nel penultimo livello, quindi quelli con radice nel terz ultimo livello ecc. strategia bottom-up giugno 2003 ASD - Heap 28

algoritmo di Floyd 0 1 2 3 4 5 6 7 8 9 10 11 12 66 5 4 67 23 64 45 21 89 68 67 39 33 66 5 4 67 23 64 45 21 89 68 67 39 33 66 5 4 67 23 64 21 89 68 67 39 33 45 giugno 2003 ASD - Heap 29

algoritmo di Floyd/2 66 5 4 66 5 4 67 68 64 45 89 68 64 45 21 89 23 67 39 33 21 67 23 67 39 33 66 5 64 66 89 64 89 68 39 45 67 68 39 45 21 67 23 67 4 33 giugno 2003 ASD - Heap 30 21 5 23 67 4 33

algoritmo di Floyd/3 89 68 64 67 67 39 45 21 5 23 66 4 33 0 1 2 3 4 5 6 7 8 9 10 11 12 89 68 64 67 67 39 45 21 5 23 66 4 33 giugno 2003 ASD - Heap 31

implementazione in Java protected Heap(int[] data) {// nuovo costruttore storage = data; size = data.length; for(int i = getparentindex(size-1); i >= 0; i--) heapify(i); public static Heap array2heap(int[] data) { return new Heap(data); giugno 2003 ASD - Heap 32

analisi algoritmo di Floyd caso peggiore: ogni chiamata di heapify fa il max numero di scambi supp. heap con n = 2 k - 1 nodi (albero binario completo di altezza k ) nell'ultimo livello ci sono (n +1)/2 foglie nel penultimo livello ci sono (n +1)/4 nodi nel terzultimo (n +1)/8 e così via n f = n i + 1 n f = n i + 1 giugno 2003 ASD - Heap 33

analisi algoritmo di Floyd/2 una chiamata di heapify su un nodo a livello i provoca al più k i scambi (op. dominanti) 1 scambio se i è penultimo livello, 2 se i è il terzultimo k-1 scambi se i=1 # max di scambi = (# nodi al penultimo livello) 1 + (# nodi al terzultimo livello) 2 + + (# nodi a livello 2) (k-2) + (# nodi a livello 1) (k-1), con k = lg(n+1) # max di scambi = ((n + 1) / 4) 1 + ((n + 1) / 8) 2 + + 2 (lg(n + 1) - 2) + 1 (lg(n + 1) - 1) giugno 2003 ASD - Heap 34

analisi algoritmo di Floyd/2 # max di scambi = log( n + 1) i = 2 n + 1 i 2 ( i 1) = = ( n + ( n + 1) 1)( log( n + 1) i = 2 log( n + 1) i = 2 i 1 i 2 i i 2 log( n + 1) i = 2 1 2 i ) giugno 2003 ASD - Heap 35

analisi algoritmo di Floyd/3 considerato che 3 i 2 = i = i 2 2 ne segue che log( n + 1) i = 2 1 2 i > 0 log( 1) 1 3 log( 1) 1 3 ( + 1) n + i < ( + 1)( n + n n ) < ( n + i = 2 i i = 2 i 2 2 2 2 # max di scambi = O(n ) 1) giugno 2003 ASD - Heap 36

applicazioni dell algoritmo di Floyd realizzazioni di operazioni nonstandard eliminazione di una chiave qualunque es.: kill di un processo dato il suo PID O(n ) per trovare la chiave, O(1) per eliminarla, O(n ) per ripristinare la condizione di heap con l algoritmo di Floyd ordinamento di un array HeapSort giugno 2003 ASD - Heap 37

HeapSort algoritmo per l ordinamento di un array arr basato su uno heap Algorithm HeapSort(array arr) { heap = Array2Heap(arr); for(i = n 1; i >= 0; i--) { max = heap.getfirst(); heap.deletefirst(); arr[i] = max; costo: O(n) + O(log n!) = O(n log n), tramite Stirling giugno 2003 ASD - Heap 38

HeapSort in Java public static void heapsort(int[] data) { Heap aheap = array2heap(data); for(int i = aheap.size - 1; i > 0; i--) { aheap.exchange(0, i); aheap.size--; aheap.heapify(0); giugno 2003 ASD - Heap 39

aspetti pratici codice della classe Heap esercizi costruire una classe MinHeap, estendendo Heap opportunamente usando per gli heap la rappresentazione collegata, quali costi si otterrebbero per le tre operazioni fondamentali? giugno 2003 ASD - Heap 40

approssimazione di Stirling ln (n!) n ln n n per n "grande" (cfr., ad es., http://mathworld.wolfram.com/stirlingsapproximation.html) giugno 2003 ASD - Heap 41