ADT Coda con priorità



Documenti analoghi
Problemi di ordinamento

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

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

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

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

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

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

Algoritmi e Strutture Dati. HeapSort

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

Spesso sono definite anche le seguenti operazioni:

Algoritmi e Strutture Dati. HeapSort

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

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

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

ALGORITMI E STRUTTURE DATI

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

Heap e code di priorità

Algoritmi e Strutture di Dati

Esercitazione 3. Heapsort

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

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

Algoritmi di ordinamento: Array e ricorsione

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

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

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

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

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

Heap e Code di Priorità

Alberi Binari di Ricerca

Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

heap concetti ed applicazioni

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

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati. Capitolo 6 Il problema del dizionario

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

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

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

Lezione 12 Tabelle Hash

Esercizi su alberi binari

Ordinamenti. Vittorio Maniezzo Università di Bologna

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

Alberi binari e alberi binari di ricerca

Visualizzazione di dati

QuickSort Università degli Studi di Milano

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

Alberi binari e alberi binari di ricerca

Laboratorio 26 Aprile 2012

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

Alberi binari e alberi binari di ricerca

Fondamenti teorici e programmazione

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

Heap, heap indiretti e code di priorità

Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4

Il numero dei nodi al livello i è 1, per 0 i altezza L altezza h di un albero completamente sbilanciato con n nodi è h = n-1

Alberi binari di ricerca

alberi completamente sbilanciati

Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.

Un albero completamente bilanciato o pieno (full) alberi completamente sbilanciati. Un albero binario completo

Algoritmi e Strutture Dati. Lezione 4

Selection Sort (minsort)

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

Esercitazione 6. Alberi binari di ricerca

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

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

Laboratorio di Algoritmi e Strutture Dati

Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4

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

Algoritmi e Strutture di Dati

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

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

Struttura di dati che può essere usata sia come dizionario, sia come coda con priorità

Note per la Lezione 4 Ugo Vaccaro

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

Alberi binari. Alberi Albero binario Heap tree

Per semplicità eliminiamo le ripetizioni nell'albero.

Esercitazione 4 Algorithmi e Strutture Dati (Informatica) A.A 2015/2016

Algoritmi e Strutture Dati

Lezione 7 Alberi binari: visite e alberi di ricerca

ALGORITMI Docente: Prof. Domenico Cantone

Alberi ed Alberi Binari di Ricerca

Tutoraggio Informatica Generale Inserimento e cancellazione in un ABR Counting Sort

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

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.

Alberi. CORDA Informatica. A. Ferrari. Testi da. Marco Bernardo Edoardo Bontà. Dispense del Corso di. Algoritmi e Strutture Dati

Indici con gli alberi

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

Struttura dati Dizionario

Alberi binari di ricerca

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

Implementazione ADT: Alberi

Transcript:

Code con priorità

ADT Coda con priorità Una coda con priorità è una struttura dati dinamica che permette di gestire una collezione di dati con chiave numerica. Una coda con priorità offre le operazioni di inserimento: di un elemento nell insieme massimo: restituisce l elemento con chiave più grande cancellazione-massimo: restituisce l elemento con chiave più grande e lo rimuove dalla collezione

Applicazioni della Coda con Priorità Le Code con priorità sono strutture dati molto comuni in informatica. Es: Gestione di processi: ad ogni processo viene associata una priorità. Una coda con priorità permette di conoscere in ogni istante il processo con priorità maggiore. In qualsiasi momento i processi possono essere eliminati dalla coda o nuovi processi con priorità arbitraria possono essere inseriti nella coda. Per implementare efficientemente una coda con priorità utilizzeremo una struttura dati chiamata heap

Nota su gli alberi binari Intuitivamente (vedremo meglio successivamente) un albero binario è una struttura dati formata da nodi collegati fra di loro (come per la struttura dati lista) Come per una lista, per ogni nodo esiste un unico nodo predecessore A differenza di una lista, ogni nodo è collegato con uno o due nodi successori

Heap Binario La struttura dati heap binario è un albero binario quasi completo Un albero binario quasi completo è un albero binario riempito completamente su tutti i livelli tranne eventualmente l ultimo che è riempito da sinistra a destra 1 2 3 4 5 6 7 8 9 10..

Proprieta' Heap Perché un albero binario quasi completo sia uno heap deve valere la seguente: Proprietà dell ordinamento parziale dello heap il valore di un nodo figlio (successore) è minore o uguale a quello del nodo padre (predecessore) 16 14 10 8 7 9 3 2 4 1

Implementazione Heap tramite Vettore Si implementa l albero tramite un vettore di lunghezza length[a] Uno heap A ha un attributo heap-size[a] che specifica il numero di elementi contenuto nello heap Nessun elemento in A[1,length[A]] dopo heap-size[a] è un elemento valido dello heap

Codifica di un albero binario quasi completo con una struttura dati vettore La radice dell albero è A[1] L indice del padre di un nodo di posizione i è i/2 L indice del figlio sinistro di un nodo i è 2 i L indice del figlio destro di un nodo i è 2 i +1

Visualizzazione di uno heap 1 2 3 4 5 6 7 8 9 10 16 14 10 8 7 9 3 2 4 1 1 16 14 10 2 3 4 5 6 7 8 7 9 3 2 4 1 8 9 10

Pseudocodice Operazioni Heap Parent(i) 1 return i/2 Left(i) 1 return 2 i Right(i) 1 return 2 i + 1

Mantenimento proprietà heap A seguito di varie operazioni sullo heap può accadere che un nodo violi la proprietà dello heap La procedura Heapify prende in ingresso uno heap A e l indice i di un nodo che potenzialmente viola la proprietà e ristabilisce la proprietà di ordinamento parziale sull intero heap Si assume che i sottoalberi figli del nodo i siano radici di heap che rispettano la proprietà di ordinamento parziale

Spiegazione L idea è di far affondare il nodo che viola la proprietà di ordinamento parziale fino a che la proprietà non viene ripristinata Per fare questo si determina il nodo figlio più grande e si scambia il valore della chiave fra padre e figlio Poi si procede ricorsivamente sul nodo figlio per cui e avvenuto lo scambio

Pseudocodice Heapify (semplificato) Heapify(A,i) 1 l Left(i) 2 r Right(i) 3 largest Max between A[l],A[r],A[i] 4 if largest i 5 then scambia A[i] A[largest] 6 Heapify(A,largest)

Pseudocodice Heapify Heapify(A,i) 1 l Left(i) 2 r Right(i) 3 if l heap size[a] e A[l]>A[i] 4 then largest l 5 else largest i 6 if r heap size[a] e A[r]>A[largest] 7 then largest r 8 if largest i 9 then scambia A[i] A[largest] 10 Heapify(A,largest)

Visualizzazione Procedura Heapify i 16 16 4 10 14 10 scambio max 14 7 9 3 i 4 7 9 3 2 8 1 2 8 1 16 14 10 Nuova iterazione 8 7 9 3 2 4 1

Nota sugli alberi binari Un albero binario completo di altezza h ha 2 h+1-1 nodi Infatti intuitivamente: un albero binario completo di altezza 0 ha un unico nodo: la radice un albero binario completo di altezza 1 è composto dalla radice e dai suoi due figli all aumentare di un livello ogni figlio genera altri due figli e quindi si raddoppia il numero di nodi del livello precedente Ogni livello di un albero binario completo contiene tanti nodi quanti sono contenuti in tutti i livelli precedenti +1 infatti passando da h a h+1 si passa da 2 h+1-1 a 2 h+2-1 nodi ovvero a 2(2 h+1 ) -1 nodi quindi il nuovo livello ha aggiunto 2 h+1 nodi ad un albero che prima ne conteneva 2 h+1-1

Tempo di calcolo di Heapify Le istruzioni per determinare il maggiore fra i, l e r impiegano un tempo Θ(1) Ricorsivamente si chiama Heapify su uno dei sottoalberi radicati in l o r Il sottoalbero di un figlio ha al più dimensione 2n/3 il caso peggiore è quando l ultimo livello è pieno per metà ovvero quando uno dei sottoalberi (quello in cui proseguirà la ricorsione) è completo Il tempo di esecuzione è pertanto: T(n)=T(2n/3)+ Θ(1)

Tempo di calcolo: Teorema principale Per il Teorema Principale si ha T(n)= Θ(lg n) infatti T(n)=T(2n/3)+1 f(n)=1, a=1, b=3/2 n log b a = n log b 1 = n 0 =Θ(1) pertanto, dato che f(n)=θ(n log b a )=Θ(1) allora (caso 2) T(n)= Θ(lg n)

Costruzione di uno heap Si può usare la procedura Heapify in modo bottomup, cioè a partire dai livelli più bassi dell albero, per convertire un Array in uno Heap Gli elementi A[ n/2 +1.. n] sono tutte foglie dell albero e pertanto ognuno di essi è già uno heap di 1 elemento Si inizia dagli elementi padri dei nodi A[ n/2 +1.. n] Dato che procediamo in modo bottom-up allora sicuramente i sottoalberi di un nodo sottoposto a Heapify sono heap

Pseudocodice Costruzione Heap Build Heap(A) 1 heap size[a] Length[A] 2 for i length[a]/2 downto 1 3 do Heapify(A,i)

Visualizzazione Costruzione Heap 1 2 3 4 5 6 7 8 9 10 4 1 3 2 16 9 10 14 8 7 Ultimo nodo non foglia foglie 4 1 3 4 1 3 4 1 3 2 16 9 10 2 16 9 10 14 16 9 10 14 8 7 14 8 7 2 8 7 4 1 10 4 16 10 16 14 10 14 16 9 3 14 7 9 3 8 7 9 3 2 8 7 2 8 1 2 4 1

Coda con priorità con heap Risulta semplice implementare le varie operazioni di una coda con priorità utilizzando uno heap Extract Max: basta restituire la radice dello heap Heap Extract Max: dopo la restituzione dell elemento massimo, posiziona l ultimo elemento dello heap (non il piu' piccolo!) nella radice ed esegue Heapify per ripristinare la proprietà di ordinamento parziale Heap Insert: la procedura inserisce il nuovo elemento come elemento successivo all ultimo e lo fa salire fino alla posizione giusta facendo scendere tutti padri

Pseudo codice operazioni Heap Extract Max(A) 1 max A[1] 2 A[1] A[heap size[a]] 3 heap size[a] heap size[a] 1 4 Heapify(A,1) 5 return max Heap Insert(A,key) 1 heap size[a] heap size[a]+1 2 i heap size[a] 3 while i>1 e A[Parent(i)]<key 4 do A[i] A[Parent(i)] 5 i Parent(i) 6 A[i] key

Visualizzazione Heap Insert 16 Inserzione chiave:15 16 Creazione nuovo nodo 14 10 14 10 8 7 9 3 8 7 9 3 2 4 1 2 4 1 * 16 Scambio posizione 16 Scrittura chiave * 10 15 10 8 14 9 3 8 14 9 3 2 4 1 7 2 4 1 7