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

Documenti analoghi
Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Problemi di ordinamento

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

ADT Coda con priorità

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

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

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

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

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

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

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

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

Spesso sono definite anche le seguenti operazioni:

Algoritmi e Strutture di Dati

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

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

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

Algoritmi e Strutture Dati. HeapSort

In questa lezione Alberi binari di ricerca

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

Algoritmi e Strutture Dati. HeapSort

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

heap concetti ed applicazioni

Esercitazione 3. Heapsort

Heap e code di priorità

algoritmi e strutture di dati

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

Heap e Code di Priorità

lezione 9 min-heap binario Heap e Alberi posizionali generali

ALGORITMI E STRUTTURE DATI

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

Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4

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

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

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

Esercizi su alberi binari

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

Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

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

Algoritmi di ordinamento: Array e ricorsione

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

Algoritmi e Strutture Dati

Algoritmi Greedy. Tecniche Algoritmiche: tecnica greedy (o golosa) Un esempio

Algoritmi e Strutture di Dati

Algoritmi e Strutture Dati

Laboratorio di Algoritmi e Strutture Dati

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

Insiemi Dinamici. Operazioni tipiche (S:struttura, x: riferimento(puntatore) alla chiave, k: chiave)

Algoritmi e Strutture Dati. Lezione 4

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

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

In questa lezione Alberi binari di ricerca: la cancellazione

Algoritmi e strutture dati

Algoritmi e Strutture di Dati

Handle di Funzioni Università degli Studi di Milano

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

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output

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

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

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.

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

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Alberi binari di ricerca

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Algoritmi e Strutture Dati. Strutture dati speciali

Problem Set 2 docente: Luciano Gualà

ALGORITMI Docente: Prof. Domenico Cantone

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

Lezione 6: 12 Novembre 2013

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

Esercizi BST - AVL. E. Fachini

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

Esercizi di Algoritmi e Strutture Dati

Algoritmi e Strutture Dati. Strutture dati speciali

Algoritmi e Strutture Dati. Capitolo 6 Il problema del dizionario

Tutoraggio Informatica Generale Inserimento e cancellazione in un ABR Counting Sort

Note per la Lezione 4 Ugo Vaccaro

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

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

Alberi ed Alberi Binari di Ricerca

Calcolare lo Span di un array di numeri

QUICKSORT. Basato sul paradigma divide-et-impera (come MERGE-SORT)

In questa lezione. Alberi binari: [CLRS09] cap. 12 per la visita inorder. visite e esercizi su alberi binari. Prof. E. Fachini - Intr. Alg.

Alberi binari di ricerca

Struttura dati Dizionario

Problemi di ricerca in insiemi ordinati

Note per la Lezione 24

QuickSort Università degli Studi di Milano

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

Informatica 3. LEZIONE 13: Liste doppie, pile e code. Modulo 1: Free list Modulo 2: Lista doppia Modulo 3: Pila Modulo 4: Coda

Esercitazione 4 Heap

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

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

Transcript:

In questa lezione Code di priorità [CLRS01] cap. 6 da pag. 114 a pag. 117 1

Coda di priorità: cos è? Una coda di priorità è una struttura dati dinamica che permette di gestire dei dati con chiave numerica, la loro priorità. In una coda la modalità di prelievo è basata sull ordine di inserimento: il primo inserito è il primo a essere estratto In una coda di priorità la modalità di prelievo si basa sulla priorità associata agli elementi 2

Coda di max-priorità: le operazioni Una coda di max-priorità offre le operazioni di Insert(S,x): inserisce x in S Maximum(S): restituisce l elemento con priorità massima Extract-Max(S): restituisce l elemento con priorità massima e lo rimuove dall insieme Increase-key(S,x,k): cambia la priorità di x al valore k, se maggiore o uguale di quella presente 3

Applicazioni In caso di condivisione di un computer fra più utenti: viene svolto per primo il lavoro con più alta priorità 4

Coda di min-priorità: le operazioni Una coda di min-priorità offre le operazioni di Insert(S,x): inserisce x in S Minimum(S): restituisce l elemento con priorità minima Extract-Min(S): restituisce l elemento con priorità minima e lo rimuove dall insieme Decrease-key(S,x,k): porta a k la priorità di x, se k è minore di quella presente 5

Applicazioni Simulazione guidata da eventi: Gli elementi della coda sono quelli da simulare e ad ogni elemento è associato il tempo nel quale si può verificare. 6

Implementazione Per implementare una coda con priorità si potrebbero utilizzare gli array In ogni implementazione si utilizza un handle (aggancio), che può essere un puntatore o un intero, per legare l oggetto alla sua priorità nell array e viceversa (qui basta un intero). implementazione insert Extract-Max Max array non ordinato Θ(1) Θ(n) Θ(n) array ordinato Θ(n) Θ(1) Θ(1) Gli heap consentono un implementazione efficiente per tutte queste operazioni! 7

Implementazione Maximum(A) A= 16 14 10 8 7 9 3 2 4 1 4 0 7 1 2 3 4 5 6 7 8 9 10 11 12 13 Heap-Maximum (A) return A[1] 16 14 10 8 7 9 3 Θ(1) 2 4 1 x = 8

Implementazione Extract-Max(A) A= 16 14 10 8 7 9 3 2 4 1 4 0 7 1 2 3 4 5 6 7 8 9 10 11 12 13 x = 14 16?? 10 8 7 9 3 2 4 1 9

Implementazione Extract-Max(A) A= 16 14 10 8 7 9 3 2 4 1 4 0 7 1 2 3 4 5 6 7 8 9 10 11 12 13 Heap-extract-Max(A) A= 14 8 10 4 7 9 3 2 1 1 4 0 7 max = 16 1 2 3 4 5 6 7 8 9 10 11 12 13 1 14 10 Max-Heapify(A,1) 14 10 8 7 9 3 8 7 9 3 2 4 1 2 4 10

Implementazione Extract-Max(A) Heap-Extract-Max (A) A è un max-heap, la procedura restituisce il massimo e ripristina la proprietà del max-heap sui rimanenti if heap-size[a] < 1 then errore: l heap è vuoto max A[1] A[1] A[heap-size[A]] heap-size[a] heap-size[a] - 1 Θ(lg n), Max-Heapify (A,1) n = heap-size(a) 11

Max-Heapify Max-Heapify (A,i) Max- Heapify fa sì che la proprietà del max-heap sia verificata per il nodo i, sotto l ipotesi che lo sia per i sottoalberi radicati nei suoi figli. Input: un l array A tale che A[left(i)] e A[right(i)] siano radici di max-heap e in cui A[i] può essere più piccolo dei suoi figli Output: l array A è tale che anche A[i] è radice di un max-heap s left(i) d right(i) if s heap-size[a] and A[s] > A[i] then massimo s else massimo i if d heap-size[a] and A[r] > A[massimo] then massimo r if massimo i then scambia A[i] e A[massimo] Max-Heapify (A,massimo) Θ(lg n), n = heap-size(a) 12

Implementazione Increase-Key A= 16 14 10 8 7 9 3 2 4 1 4 0 7 1 2 3 4 5 6 7 8 9 10 11 12 13 Increase-key(A,15) A= 16 15 10 14 7 9 3 2 8 1 4 0 7 1 2 3 4 5 6 7 8 9 10 11 12 13 16 14 10 4 15 8 7 9 3 2 4 1 15 13

Correttezza Increase-key Heap-increase-key(A,i,key) A è un max-heap. Sostituisce key ad A[i], se key A[i] e ripristina la proprietà del max-heap if key < A[i] then errore: la nuova chiave è più piccola A[i] key while i > 1 and A[Parent(i)] < A[i] Invariante: L array A[1...heap-size] soddisfa la proprietà del max-heap tranne al più nella posizione i, se 1 i heap-size, perchè A[i] potrebbe essere maggiore di A[Parent(i)] do scambia A[Parent(i)] con A[i] i Parent(i) 14

Correttezza Increase-key Heap-increase-key(A,i,key) A è un max-heap. Sostituisce key ad A[i], se key A[i] e ripristina la proprietà del max-heap if key < A[i] then errore: la nuova chiave è più piccola A[i] key while i > 1 and A[Parent(i)] < A[i] Invariante: L array A[1...heap-size] soddisfa la proprietà del max-heap tranne al più nella posizione i, se 1 i heap-size, perchè A[i] potrebbe essere maggiore di A[Parent(i)] do scambia A[Parent(i)] con A[i] i Parent(i) Inizializzazione: L invariante è banalmente vero prima di ogni iterazione visto che il valore in A[i] all entrata nel ciclo è diventato key e quindi A[i] può essere maggiore di A[Parent(i)] 15

Correttezza Increase-key Heap-increase-key(A,i,key) A è un max-heap. Sostituisce key ad A[i], se key A[i] e ripristina la proprietà del max-heap if key < A[i] then errore: la nuova chiave è più piccola A[i] key while i > 1 and A[Parent(i)] < A[i] Invariante: L array A[1...heap-size] soddisfa la proprietà del max-heap tranne al più nella posizione i, se 1 i heap-size, perchè A[i] potrebbe essere maggiore di A[Parent(i)] do scambia A[Parent(i)] con A[i] i Parent(i) Conservazione: supponiamo che l array A[1...heap-size] soddisfi la proprietà del max-heap, tranne al più in A[k] che potrebbe essere maggiore di A[Parent(k)]. Se questo è il caso lo scambio assicura che la proprietà del max-heap è ripristinata per A[k],visto che il nuovo padre è maggiore anche del (vecchio) fratello, per transitività 16

Correttezza Increase-key Heap-increase-key(A,i,key) A è un max-heap. Sostituisce key ad A[i], se key A[i] e ripristina la proprietà del max-heap if key < A[i] then errore: la nuova chiave è più piccola A[i] key while i > 1 and A[Parent(i)] < A[i] Invariante: L array A[1...heap-size] soddisfa la proprietà del max-heap tranne al più nella posizione i, se 1 i heap-size, perchè A[i] potrebbe essere maggiore di A[Parent(i)] do scambia A[Parent(i)] con A[i] i Parent(i) Conclusione: sappiamo che l array A[1...heap-size] soddisfa la proprietà del max-heap, tranne al più in A[i] che potrebbe essere maggiore di A[Parent(i)], ma i=0 o A[Parent(i)] A[i], quindi la proprietà del max-heap è soddisfatta ovunque. 17

Increase-key: complessità Heap-increase-key(A,i,key) A è un max-heap. Sostituisce key ad A[i], se key A[i] e ripristina la proprietà del max-heap if key < A[i] then errore: la nuova chiave è più piccola A[i] key while i > 1 and A[Parent(i)] < A[i] do scambia A[Parent(i)] con A[i] i Parent(i) Caso peggiore: Θ(lg n), n = heap-size(a) 18

Implementazione Insert(A,x) A= 16 14 10 8 7 9 3 2 4 1 4 0 7 1 2 3 4 5 6 7 8 9 10 11 12 13 Insert(A,15) heap-size(a)=10 A= 16 15 10 8 14 9 3 2 4 1 7 0 7 14 16 10 1 2 3 4 5 6 7 8 9 10 11 12 13 heap-size(a)=11 8 7 9 3 2 4 1 15 19

Implementazione Insert(A,x) Max-Heap-insert(A,key) A è un max-heap. Inserisce key in A, ripristinando la proprietà del max-heap if heap-size[a] = length[a] then errore: l heap è pieno heap-size[a] heap-size[a] +1 A[heap-size[A]] - - indica un elemento certamente più piccolo di key Heap-increase-key(A,heap-size[A],key) Caso peggiore: Θ(lg n), n = heap-size(a) 20

Sommario dei costi implementazione insert Extract-Max Max array non ordinato Θ(1) Θ(n) Θ(n) array ordinato Θ(n) Θ(1) Θ(1) heap Θ(lg n) Θ(lg n) Θ(1) Complessità nel caso peggiore di diverse implementazioni di una coda di priorità con n elementi 21

Cancellare un elemento Può essere inoltre utile l operazione Delete(A,i): cancella A[i] da A 22

Implementazione Delete(A,x) A= 16 14 10 8 7 9 3 2 4 1 4 0 7 Delete(A,2) 1 2 3 4 5 6 7 8 9 10 11 12 13 heap-size(a)=10 L ultima foglia al posto dell elemento da cancellare A= 16 1 10 8 7 9 3 2 4 1 4 0 7 14 16 10 1 2 3 4 5 6 7 8 9 10 11 12 13 Proprietà del maxheap violata rispetto ai figli: heap-size(a)=9 8 7 9 3 Max-heapfy(A,2) 2 4 1 23

Implementazione Delete(A,x) A= 46 14 30 8 7 29 28 2 4 6 5 20 7 1 2 3 4 5 6 7 8 9 10 11 12 13 Delete(A,4) heap-size(a)=12 A= 46 20 30 14 7 29 28 2 4 6 5 20 7 46 1 2 3 4 5 6 7 8 9 10 11 12 13 14 30 heap-size(a)=11 8 7 29 28 20 va al posto di 8, ma è maggiore di 14! 2 4 6 5 20 24