Heap binomiali Gli heap binomiali sono strutture dati su cui si possono eseguire efficientemente le operazioni: Make(H) : crea uno heap vuoto Insert(H,

Slides:



Advertisements
Presentazioni simili
Algoritmi e Strutture Dati
Advertisements

Strutture dati per insiemi disgiunti
Algoritmi e Strutture Dati
TAV.1 Foto n.1 Foto n.2 SCALINATA DI ACCESSO ALL’EREMO DI SANTA CATERINA DEL SASSO DALLA CORTE DELLE CASCINE DEL QUIQUIO Foto n.3 Foto n.4.
Frontespizio Economia Monetaria Anno Accademico
Algoritmi e Strutture Dati
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
1 Tavolo del Patto per la crescita intelligente, sostenibile e inclusiva Il ricorso agli ammortizzatori sociali nei territori colpiti dagli eventi sismici.
RB-alberi (Red-Black trees)
Code a priorità (Heap) Definizione
Strutture dati elementari
Alberi binari di ricerca
Heap binomiali.
Cammini minimi con sorgente singola
Reaching Definitions. Tino CortesiTecniche di Analisi di Programmi 2 Reaching definitions Dato un punto del programma, quali sono i comandi di assegnamento.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Capitolo 8 Code con priorità Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
Capitolo 8 Code con priorità Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Algoritmi e Strutture Dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Stesso approccio.
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
Algoritmo di Ford-Fulkerson
1 Strutture dati avanzate Vedremo alcune strutture dati che permettono di eseguire in modo particolarmente efficiente un determinato insieme di operazioni.
Algoritmi e strutture Dati - Lezione 7
Il problema del dizionario
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 8 Code con.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Capitolo 9 Il problema della gestione di insiemi disgiunti (Union-find) Algoritmi e Strutture Dati.
Interrogazioni su un albero binario di ricerca Search(S,k) – dato un insieme S ed un valore chiave k restituisce un puntatore x ad un elemento in S tale.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Alberi AVL (Adelson-Velskii.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Ufficio Studi UNIONCAMERE TOSCANA 1 Presentazione di Riccardo Perugi Ufficio Studi UNIONCAMERE TOSCANA Firenze, 19 dicembre 2000.
Algoritmi e Strutture Dati Alberi Binari di Ricerca.
Algoritmi e Strutture Dati (Mod. A)
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati 20 aprile 2001
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Heap binari e HeapSort.
QuickSort Quick-Sort(A,s,d) IF s < d THEN q = Partiziona(A,s,d) Quick-Sort(A,s,q-1) Quick-Sort(A,q + 1,d)
Analisi di Immagini e Dati Biologici
Fibonacci Heaps e il loro utilizzo nell’algoritmo di Prim
Anche la RB-Delete ha due fasi: Nella prima viene tolto un nodo y avente uno dei sottoalberi vuoto sostituendolo con la radice dellaltro sottoalbero. Per.
Scheda Ente Ente Privato Ente Pubblico. 2ROL - Richieste On Line.
Radix-Sort(A,d) // A[i] = cd...c2c1
Bando Arti Sceniche. Per poter procedere è indispensabile aprire il testo del Bando 2ROL - Richieste On Line.
Calcolo Parallelo e Distribuito
Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo L’esplorazione inizia dalla cella h(k,0) = h'(k) e continua.
RB-insert(T, z) // z.left = z.right = T.nil Insert(T, z) z.color = RED // z è rosso. Lunica violazione // possibile delle proprietà degli alberi // rosso-neri.
Per valutare la complessità ammortizzata scomponiamo ogni Union: nelle due FindSet e nella Link che la costituiscono e valuteremo la complessità in funzione.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
B trees.
Soluzione: Algoritmo Heap-Sort Un array A[1..n] può essere interpretato come un albero binario: A[1] è la radice, A[2i] e A[2i+1] sono i figli di A[i]
alberi completamente sbilanciati
AlgoLab - Code unificabili Code unificabili con alberi binomiali Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
Alberi Alberi radicati : alberi liberi in cui un vertice è stato scelto come radice. Alberi liberi : grafi non orientati connessi e senza cicli. Alberi.
Capitolo 8 Code con priorità Algoritmi e Strutture Dati Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano.
Alberi rosso-neri Le operazioni sugli alberi binari di ricerca hanno complessità proporzionale all’altezza h dell’albero. Gli alberi rosso-neri sono alberi.
Heap di Fibonacci.
Transcript della presentazione:

Heap binomiali Gli heap binomiali sono strutture dati su cui si possono eseguire efficientemente le operazioni: Make(H) : crea uno heap vuoto Insert(H, x) : aggiunge il nodo x allo heap Minimum(H) : restituisce il puntatore al nodo con chiave minima ExtractMin(H) : restituisce il puntatore al nodo con chiave minima dopo averlo tolto dallo heap Mucchi binomiali

Union(H1, H2) : riunisce due heap in uno solo Oltre alle precedenti operazioni fondamentali degli heap riunibili, sugli alberi binomiali definiremo anche le due ulteriori operazioni: DecreaseKey(H, x, k) : cambia la chiave di x con una minore; Delete(H, x) : toglie il nodo x;

Gli heap binomiali sono insiemi di alberi binomiali Un albero binomiale Bk di grado k è un albero ordinato (vi è un ordine tra i figli di ogni nodo) definito ricorsivamente nel seguente modo: L’albero binomiale B0 di grado 0 consiste in un solo nodo (radice) Alberi binomiali

L’albero binomiale Bk di grado k > 0 consiste in due alberi binomiali di grado k - 1 legati ponendo la radice del primo come primo figlio della radice del secondo Graficamente: B0 Bk-1 Bk

B0 B1 B2 B3 B4

Proprietà degli alberi binomiali. L’albero binomiale Bk: 1) ha 2k nodi; 2) ha altezza k; 3) ha esattamente nodi a livello i; 4) la radice ha grado k e tutti gli altri nodi hanno grado minore; 5) se xk-1, xk-2, ..., x0 sono i figli della radice elencati per indice decrescente da sinistra a destra allora xi è radice di un albero binomiale Bi di grado i.

Bk Bk-1 Bk-2 B0 B2 B1 ......... Limiti dimensionali Un albero binomiale di n = 2k nodi ha altezza e grado massimo entrambi uguali a k = log2 n

Dimostrazione L’albero binomiale B0: 1) ha 20 = 1 nodi 2) ha altezza 0 3) ha esattamente nodi a livello 0 4) la radice ha grado 0 e non ci sono altri nodi 5) la radice non ha figli Quindi le cinque proprietà sono vere per k = 0 (la terza per ogni k e per i = 0) Assumiamole vere per k-1 e dimostriamole per k

1) Bk è costituito da due copie di Bk-1 e quindi ha 2k-1 + 2k-1 = 2k nodi; 2) l’altezza di Bk è uno in più dell’altezza di Bk-1. Quindi Bk ha altezza k-1+1 = k; 3) Sia D(k,i) il numero di nodi a livello i in Bk Per 0 < i < k i nodi a livello i sono i nodi a livello i di una delle due copie di Bk-1 che formano Bk più i nodi a livello i-1 dell’altra e pertanto

4) la radice di Bk ha un figlio più della radice di Bk-1. Essa ha quindi grado k-1+1 = k; 5) il primo figlio xk-1 della radice di Bk è radice di uno dei due Bk-1 che lo formano mentre i figli successivi xk-2, ..., x0 sono i figli dell’altro Bk-1 e, per ipotesi induttiva, sono quindi radici di alberi binomiali Bk-2, ..., B0 .

Definizione di heap binomiale Uno heap binomiale H è un insieme di alberi binomiali tale che: Ogni albero binomiale di H ha la proprietà 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 e crescenti Def. mucchio binomiale

Proprietà degli heap binomiali Sia H uno heap binomiale con n nodi in totale e sia bkbk-1...b0 la rappresentazione binaria di n. Allora: 1) H contiene l’albero binomiale Bi se e solo se bi = 1. 2) H contiene al più log2 n +1 alberi.

Dimostrazione. Sia H uno heap binomiale con n nodi in totale e sia bkbk-1...b0 la rappresentazione binaria di n. Allora: 1) un albero binomiale Bi in H contiene 2i nodi e quindi n è somma di potenze di 2 distinte. L’unico modo in cui si può esprimere n come somma di potenze di 2 distinte è (pensateci con le potenze di 10) 2) Se lo heap contenesse Bk con 2k > n, eccederebbe il numero di nodi consentito. Quindi, al più usa tutti gli alberi da B0 a Bk con k = log2 n

I nodi hanno i seguenti campi: key : la chiave; 10 cima[H] 27 38 8 14 29 6 18 25 12 1 11 17 I nodi hanno i seguenti campi: key : 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 ausiliari

cima[H] 10 1 2 12 18 25 8 11 27 17 6 3 14 29 sibling parent child

Minimum La funzione Minimum è: Minimum(H)  PRE: H non è vuoto x  cima[H], kmin  key[x] while sibling[x]  nil do x  sibling[x] if kmin > key[x] then kmin  key[x] return kmin Siccome ci sono al più log2 n +1 alberi essa richiede tempo O(log n).

La funzione ausiliaria Link è usata da molte altre Link(y, z)  PRE: y e z sono radici di alberi binomiali  dello stesso grado parent[y]  z sibling[y]  child[z] child[z]  y degree[z]  degree[z] + 1 La funzione ausiliaria Link è usata da molte altre Aggiunge y come primo figlio di z. Richiede tempo costante O(1). Nel seguito, assumiamo di avere una funzione Union() che fonde due heap in tempo O(log n).

La funzione Insert è: Insert Insert(H, x) parent[x]  nil, sibling[x]  nil child[x]  nil , degree[x]  0 cima[H1]  x Union(H,H1) Siccome Union richiede tempo O(log n) anche Insert richiede tempo O(log n).

ExtractMin cima[H] cima[H] x 10 27 38 8 14 29 6 18 25 12 1 11 17 10 27

cima[H] x cima[H] x cima[H1] 10 27 38 8 14 29 6 18 25 12 1 11 17 10 27

cima[H] x cima[H1] cima[H] x 10 27 38 8 14 29 6 18 25 12 1 11 17 27 38

La funzione ExtractMin è: ExtractMin(H) x  cima[H], if x = nil then return nil z  nil, kmin  key[x], y  sibling[x] while y  nil do  cerca la radice minima if kmin > key[y] then z  x, kmin  key[y] x  y, y  sibling[x] if z = nil then  la radice minima è la prima x  cima[H], cima[H]  sibling[x] else  la radice minima è quella che segue z x  sibling[z], sibling[z]  sibling[x]

cima[H1]  nil  costruisce un heap H1 con i figli di x while child[x]  nil do y  child[x] child[x]  sibling[y] parent[y]  nil sibling[y]  cima[H1] cima[H1]  y Union(H,H1)  unisce i due heap return x

Il primo ciclo while percorre la lista delle radici ed ha quindi complessità O(log n). Il secondo ciclo while 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 ExtractMin richiede tempo O(log n).

La funzione DecreaseKey è: DecreaseKey(H, x, k) if k > key[x] then errore “la nuova chiave non è minore della vecchia” key[x]  k y  parent[x] while y  nil and key[y] > key[x] do k  key[x], key[x]  key[y], key[y]  k “scambia anche eventuali campi associati” x  y, y  parent[x] Siccome l’altezza è O(log n) anche DecreaseKey richiede tempo O(log n).

Delete La funzione Delete è: Delete(H, x) DecreaseKey(H, x, -) ExtractMin(H) Siccome sia DecreaseKey che ExtractMin hanno complessità O(log n) anche Delete richiede tempo O(log n).

Union La logica è semplice (l’implementazione meno…) Percorre le due liste delle radici e le fonde nella prima quando un albero Bi c’è e l’altro no, lo aggiunge quando ci sono entrambi, aggancia uno all’altro, ottenendo un solo albero Bi+1 se già esisteva un Bi+1 aggancia un albero all’altro, ottenendo un solo albero Bi+2 ripete gli accorpamenti finché necessario per eliminare i doppioni Union

Sia x la radice corrente in H1 e y quella in H2 Procediamo scorrendo H1 con x e sganciando via via y finché non abbiamo scorso interamente le due liste xp è la radice che precede x (per manipolare la lista H1) ys è la radice che segue y (per scorrere H2 dopo aver sganciato y Union(H1,H2) x  cima[H1], xp  nil y  cima[H2], cima[H2] = nil while x  nil and y  nil do  I° while Union

Caso 1. xp x xp x y y if degree[y] > degree[x] then  caso 1 xp  x, x  sibling[x] Finché l’albero in y è più grosso di quello in x sposto avanti x… xp x xp x y y

Caso 2. xp x xp x Quando l’albero in y è più piccolo di quello in x, else if degree[y] < degree[x] then  caso 2 ys  sibling[y] if xp = nil then cima[H1]  y else sibling[xp]  y sibling[y]  x, xp  y y  ys xp x xp x Quando l’albero in y è più piccolo di quello in x, lo aggancio fra xp e x y ys y

Caso 3 Se i due alberi sono uguali, vanno fusi Intanto, prepariamo il successivo valore di y… else  caso 3: degree[y] = degree[x] ys  sibling[y]

Caso 3.1. if key[x] > key[y] then  caso 3.1 xs  sibling[x] Link(x,y) if xp = nil then cima[H1]  y else sibling[xp]  y sibling[y]  xs x  y, y  ys Se x ha chiave più alta, aggancio x a y e inserisco y nella lista della radici (due casi secondo che sia in cima alla lista o no) xp x xp x 7 4 7 y ys y 4

Caso 3.2. else  caso 3.2 Link(y,x) y  ys Se x non ha chiave più alta, aggancio y a x xp x xp x 4 4 7 y ys y 7

xs  sibling[x] while xs  nil and degree[x] = degree[xs] do  II° while Dopo la fusione, l’albero in x e quello in xs possono essere di ugual dimensione. Finché è così, li fondo Ancora una volta, abbiamo due casi: chiave di x più alta di quella di xs (caso 3.3: aggancio di xs a x e inserimento di x nella lista) chiave di x non più alta di quella di xs (caso 3.4: semplice aggancio di x a xs)

Caso 3.3. Caso 3.4. xp x xs xp x xs xp x xs if key[x] > key[xs] then  caso 3.3 Link(x,xs) if xp = nil then cima[H1]  xs else sibling[xp]  xs x  xs else  caso 3.4 sibling[x]  sibling[xs] Link(xs,x) xs  sibling[x] Caso 3.3. xp x xs 7 4 xp x xs Caso 3.4. 4 7 xp x xs 4 7

if y  nil then if xp = nil then cima[H1]  y else sibling[xp]  y Arrivati in fondo ad H1, se in H2 c’è qualcos’altro, va direttamente appeso ad H1 (due sottocasi, secondo che H1 sia vuota o no)

Siano m1 ed m2 il numero di alberi contenuti nei due heap da unire, m quello dello heap risultante Il ciclo while più esterno si esegue al più m1 + m2 volte Ad ogni esecuzione del ciclo while interno il numero totale di alberi diminuisce di uno. Quindi esso viene eseguito al più m1 + m2 - m volte. Siccome m1, m2 ed m sono tutti O(log n) anche Union richiede tempo O(log n).

Esiste una struttura dati, i mucchi di Fibonacci, in cui le stesse operazioni si eseguono con le seguenti complessità ammortizzate.