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

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

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

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

Alberi binari di ricerca

Strutture dati per insiemi disgiunti

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

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

Algoritmi e Strutture Dati

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

Alberi rosso-neri. Oltre ad essere alberi binari di ricerca, gli alberi rosso-neri soddisfano le seguenti proprietà:

Algoritmi e Strutture di Dati

Alberi rosso-neri. Le operazioni sugli alberi binari di ricerca hanno complessità proporzionale all altezza h dell albero.

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

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

Algoritmi e Strutture Dati. HeapSort

B-alberi. Strutture dati avanzate

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

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

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

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

Alberi ed Alberi Binari

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

Problemi di ordinamento

Algoritmi e strutture dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

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

In questa lezione Alberi binari di ricerca

Algoritmi e Strutture Dati

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

Algoritmi e Strutture Dati. HeapSort

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

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

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

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

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

Strutture Merge-Find

Spesso sono definite anche le seguenti operazioni:

Algoritmi, Strutture Dati e Programmi. UD 3.d: Strutture Dati Dinamiche Alberi

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

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

ADT Coda con priorità

Alberi ed Alberi Binari di Ricerca

23/10/2016. gli alberi. alcune definizioni. un esempio. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica.

Alberi. Definizione, realizzazione e algoritmi elementari. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 7

Alberi Binari di Ricerca e Alberi Rosso-Neri

Esercizi su alberi binari

Heap e Code di Priorità

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.

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

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

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

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

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

Alberi binari e alberi binari di ricerca

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

Esercizi BST - AVL. E. Fachini

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

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.

Alberi binari e alberi binari di ricerca

alberi completamente sbilanciati

Dati e Algoritmi 1: A. Pietracaprina. Alberi Binari

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

Indici con gli alberi

Heap e code di priorità

Corso di Programmazione

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

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

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

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

In questa lezione Alberi binari di ricerca: la cancellazione

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

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

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

Lezione 6: 12 Novembre 2013

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

Algoritmi e Strutture Dati

Dizionari. Realizzazione con alberi binari di ricerca. Alberi rosso-neri. Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez.

Alberi Binari di Ricerca

Ricerca con una chiave k Assumiamo l esistenza di un descrittore albero con i campi: albero.radice (=null per l albero vuoto) albero.dimensione (=0 pe

Algoritmi di ordinamento

Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

Alberi Binari di Ricerca

Dizionari. Dizionari con gli alberi. Alberi binari di ricerca. Realizzazione con alberi binari di ricerca. Alberi rosso-neri.

Alberi n-ari: specifiche sintattiche e semantiche. Realizzazioni. Visita di alberi n-ari.

Strutture dati elementari. Vittorio Maniezzo - Università di Bologna

Esercizi Capitolo 6 - Alberi binari di ricerca

Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)

Dipartimento di Elettronica, Informazione e Bioingegneria API 2013/4

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Fondamenti teorici e programmazione

L albero e un tipo astratto di dati usato per rappresentare relazioni gerarchiche.

Algoritmi e Strutture Dati. Alberi

Alberi binari e alberi binari di ricerca

Corso di Programmazione

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Algoritmi e Strutture Dati. Capitolo 6 Il problema del dizionario

Transcript:

Heap binomiali Gli heap binomiali sono strutture dati su cui si possono eseguire efficientemente le operazioni: Make(H) : crea un heap vuoto. Insert(H, ) : aggiunge il nodo allo heap. Minimum(H) : ritorna il puntatore al nodo con chiave minima. EtractMin(H) : ritorna il puntatore al nodo con chiave minima dopo averlo tolto dallo heap. Union(H, H 2 ) : riunisce due heap in un unico heap. Oltre alle precedenti operazioni fondamentali degli heap riunibili, sugli heap binomiali definiremo anche le due ulteriori operazioni: DecreaseKe(H,, k) : cambia la chiave di con una minore. Delete(H, ) : toglie il nodo. Mucchi binomiali 2 Alberi binomiali Gli heap binomiali sono insiemi di alberi binomiali. Un albero binomiale B k di grado k è un albero ordinato (vi è un ordine tra i figli di ogni nodo) definito ricorsivamente nel seguente modo: L albero binomiale B k di grado k > 0 è costituito da due alberi binomiali di grado k - collegati tra loro ponendo la radice del primo come primo figlio della radice del secondo. Graficamente: B 0 B k L albero binomiale B 0 di grado 0 è costituito da un solo nodo, la radice. B k- B k- Alberi binomiali 3 B 0 B B 2 B 3 B Proprietà degli alberi binomiali. L albero binomiale B k : ) ha 2 k nodi; 2) ha altezza k; k 3) ha esattamente i nodi a livello i; ) la radice ha grado k e tutti gli altri nodi hanno grado minore; 5) se k-, k-2,..., 0 sono i figli della radice elencati per indice decrescente da sinistra a destra allora i è radice di un albero binomiale B i di grado i. 5

B k- B k-2 B k... B 2 B B 0 Dimostrazione. L albero binomiale B 0 : ) ha 2 0 = nodi; 2) ha altezza 0; 3) ha esattamente 0 0 = nodi a livello 0; ) la radice ha grado 0 e non ci sono altri nodi; 5) la radice non ha figli; Limiti conseguenti. Un albero binomiale di n = 2 k nodi ha sia altezza che grado uguali a k = log 2 n. quindi le cinque proprietà sono vere per k = 0. Assumiamole vere per k- e dimostriamole per k. 8 ) B k è costituito da due copie di B k- e quindi ha 2 k- + 2 k- = 2 k nodi; 2) l altezza di B k è uno in più dell altezza di B k-. Quindi B k ha altezza k-+ = k; 3) Sia D(k,i) il numero di nodi a livello i in B k. Allora D( k,0) = = k 0 D( k, k ) = D( k, k ) = k = k k k 9 Mentre per 0 < i < k i nodi a livello i sono i nodi a livello i di una delle due copie di B k- che formano B k più i nodi a livello i+ dell altra e pertanto D( k, i) = D( k, i) + D( k, i + ) = k = + k k i i i 0 ) la radice di B k ha un figlio più della radice di B k-. Essa ha quindi grado k-+ = k; 5) il primo figlio k- della radice di B k èradice di uno dei due B k- che lo formano mentre i figli successivi k-2,..., 0 sono i figli dell altro B k- e, per ipotesi induttiva, sono quindi radici di alberi binomiali B k-2,..., B 0. Definizione di heap binomiale Un heap binomiale H è un insieme di alberi binomiali tale che: ) Ogni albero binomiale di H è ordinato a min-heap: ad ogni nodo è associata una chiave e la chiave di ciascun nodo è maggiore della chiave del padre. 2) Gli alberi binomiali in H hanno gradi distinti. Def. mucchio binomiale 2 2

Proprietà degli heap binomiali. Sia H un heap binomiale con n nodi in totale. Allora: H contiene al più log 2 n + alberi. Dimostrazione. Sia H un heap binomiale con n nodi in totale e sia b k b k-...b 0 la rappresentazione binaria di n. Allora: * un albero binomiale B i in H contiene 2 i nodi e quindi n è somma di potenze di 2 distinte. Ma l unico modo in cui si può esprimere n come k somma di potenze di 2 distinte è n = = b 0 i 2 i i * Il numero di alberi è al numero di cifre nella rappresentazione binaria di n, ovvero log 2 n + 3 0 2 8 8 29 I nodi hanno i seguenti campi: ke : la chiave; parent : puntatore al padre child : puntatore al primo figlio sibling : puntatore al fratello destro degree : numero di figli. oltre ad eventuali altri campi per informazioni associate alla chiave 0 0 2 sibling parent child 2 8 0 0 8 2 0 0 8 0 3 29 0 5 Molte operazioni usano la funzione ausiliaria: Link(, z) > PRE: e z sono radici di alberi binomiali > dello stesso grado parent[] z sibling[] child[z] child[z] degree[z] degree[z] + Aggiunge come primo figlio di z. Richiede tempo costante O(). Link La funzione Minimum è: Minimum Minimum(H) > PRE: H non è vuoto, kmin ke[] while sibling[] nil do sibling[] if kmin > ke[] then kmin ke[] return kmin Siccome ci sono al più log 2 n + alberi essa richiede tempo O(log n). 8 3

La funzione Union percorre le due liste delle radici riunendole nella prima delle due. Union(H,H2), p nil head[h2], head[h2] = nil while nil and nil do > I while p Caso. deg[] < deg[] p In dipendenza dei gradi di e di si possono presentare i seguenti casi: Union 9 20 if degree[] > degree[] then > caso p, sibling[] p Caso 2. deg[] < deg[] p s 2 22 else if degree[] < degree[] then > caso 2 s sibling[] if p = nil then else sibling[p] sibling[], p s else s sibling[] > caso 3: degree[] = degree[] p Caso 3.. ke[] > ke[] p s 23 2

else s sibling[] > caso 3: degree[] = degree[] if ke[] > ke[] then > caso 3. s sibling[] Link(,) if p = nil then else sibling[p] sibling[] s, s p Caso 3.2. ke[] > ke[] p s 2 else > caso 3.2 Link(,) s p Caso 3.3. s s sibling[] while s nil and degree[] = degree[s] do > II while p Caso 3.. s p s 28 if ke[] > ke[s] then > caso 3.3 Link(,s) if p = nil then s else sibling[p] s s else > caso 3. sibling[] sibling[s] Link(s,) s sibling[] if nil then if p = nil then else sibling[p] 29 30 5

Siano m ed m 2 il numero di alberi contenuti nei due heap da unire ed m quello dello heap ottenuto. Il ciclo while più esterno viene eseguito al più m +m 2 volte. Ad ogni esecuzione del ciclo while interno il numero totale di alberi diminuisce di uno. Quindi esso viene eseguito al più m + m 2 - m volte. Siccome m, m 2 ed m sono tutti O(log n) anche Union richiede tempo O(log n). La funzione Insert è: Insert(H, ) parent[] nil, sibling[] nil child[] nil, degree[] 0 Union(H,H) Siccome Union richiede tempo O(log n) anche Insert richiede tempo O(log n). Insert 3 32 EtractMin 0 0 8 29 2 8 29 2 8 8 0 2 8 8 29 33 0 2 8 8 29 3 0 2 8 8 29 La funzione EtractMin: idea EtractMin EtractMin(H) radice con chiave minima - elimina dalla lista delle radici di H - crea uno heap H tale che head[h ] punta alla lista concatenata dei figli di, invertita Union(H,H) > unisce i due heap 0 2 8 29 8 35 3

La funzione EtractMin è: EtractMin EtractMin(H) if = nil then return nil p nil, kmin ke[] while sibling[] nil do > p radice che precede if kmin > ke[sibling[]] then > quella minima kmin ke[sibling[]], p sibling[] if p = nil then > la radice minima è la prima, sibling[] else > la radice minima è quella che segue p sibling[p], sibling[p] sibling[] 3 buildheap(h, ) > costruisce un heap H con i figli di Union(H,H) > unisce i due heap return dove la procedura buildheap è: buildheap(h, ) > costruisce un heap H con i figli di nil while child[] nil do child[] child[] sibling[] parent[] nil sibling[] Il primo ciclo while percorre la lista delle radici ed ha quindi complessità O(log n). buildheap percorre la lista dei figli di una radice. Siccome il grado è O(log n) anche tale ciclo ha complessità O(log n). Infine Union richiede tempo O(log n) e quindi anche EtractMin richiede tempo O(log n). 39 0 La funzione DecreaseKe è: DecreaseKe DecreaseKe(H,, k) if k > ke[] then errore la nuova chiave non è minore della vecchia ke[] k parent[] while nil and ke[] > ke[] do k ke[], ke[] ke[], ke[] k scambia anche eventuali campi associati, parent[] Siccome l altezza è O(log n) anche DecreaseKe richiede tempo O(log n). Delete La funzione Delete è: Delete(H, ) DecreaseKe(H,, - ) EtractMin(H) Siccome sia DecreaseKe che EtractMin hanno complessità O(log n) anche Delete richiede tempo O(log n). 2

Operazione Complessità Make Θ() Insert O(log n) Minimum O(log n) EtracMin O(log n) Union O(log n) DecreaseKe O(log n) Delete O(log n) Esercizio 2. Supponiamo che non esista una rappresentazione della chiave -. Riscrivere al funzione Delete per gli heap binomiali in modo che essa non usi la chiave -. Assicurarsi che la complessità rimanga O(log n). 3 Esercizio. Nella funzione EtractMin abbiamo dovuto percorrere tutta la lista dei figli del nodo estratto per invertirne l ordine. Questo perché la lista delle radici è ordinata per grado crescente mentre le liste dei figli sono ordinate per grado decrescente. Cosa succede se ordiniamo le due liste in modo concorde? 5 Esiste una struttura dati, gli heap di Fibonacci, in cui le stesse operazioni si eseguono con le seguenti complessità ammortizzate. Operazione Complessità ammortizzata Make Θ() Insert Θ() Minimum Θ() EtractMin O(log n) Union Θ() DecreaseKe Θ() Delete O(log n) Esercizio 28. Dimostrare che non esiste nessuna struttura dati che permetta di eseguire le tre operazioni Make, Insert ed EtractMin in tempo costante (sia caso pessimo che ammortizzato). 8