B-alberi e alberi autoaggiustanti Lezione n°6 Prof.ssa Rossella Petreschi Lezione del 22 /10/2012 del Corso di Algoritmi e Strutture Dati Riferimenti: Paragrafo 7.5/7.6 del testo Kingston “Algorithms and data structures” Edizioni: Addison-Wesley Capitolo 18 del testo Cormen, Leiserson, Rivest, Stein “Introduzione agli algoritmi” Edizioni: McGrawHill
Eliminazione di una chiave in un B-albero L’operazione di eliminazione in un B-albero è analoga a quella già vista per un albero binario di ricerca e richiede il controllo del numero di chiavi del nodo su cui si è operato (debbono rimanere almeno t-1 chiavi) Si cerca la chiave da cancellare; se la chiave è in una foglia, la si elimina; se la chiave è in un nodo interno la si sostituisce con il predecessore (o il successore), che è in una foglia, e ci si riconduce al caso precedente Ogni volta che da una foglia si elimina una chiave si deve controllare se il numero di chiavi rimane almeno pari a t-1. Se ciò non accade, bisogna opportunamente rimanipolare la struttura.
Il supporto di un fratello Un nodo y che rimane con meno di t-1 chiavi deve chiedere aiuto ad un fratello, f(y), per effettuare una opportuna ridistribuzione delle chiavi. La ridistribuzione mette in gioco le chiavi presenti nei nodi y e f(y) nonché la loro chiave di separazione presente nel nodo padre. Per effettuare la ridistribuzione, f(y) deve avere almeno t chiavi in modo che al termine della ridistribuzione y e f(y) abbiano almeno t-1 chiavi ciascuno. Se f(y) ha t-1 chiavi, prima di effettuare una ridistribuizione, bisogna fondere y e f(y) in un solo nodo. La fusione consiste nell’eliminare y e nel riportare in f(y) tutte le chiavi di y e la chiave di separazione che era presente nel nodo padre. f(y) avrà quindi 2t-2 nodi ATTENZIONE!!
Decremento dell’altezza L’operazione di fusione sposta da p(y) a f(y) la chiave di separazione fra y e f(y) che era presente nel nodo padre. Questo potrebbe causare la necessità di iterare la fusione fra due nodi. Questo processo può propagare verso l’alto fino ad arrivare alla radice. Se i nodi da fondere sono i due unici figli della radice, il risultato della fusione è una nuova radice mentre si decrementa l’altezza dell’albero La complessità dell’intera operazione di eliminazione (comprensiva delle eventuali fusioni di nodi) rimane dell’ordine di O(t h(T))
B+-tree chiavi solo nelle foglie; nodi interni contengono solo puntatori per indicare la strada verso le foglie; le foglie sono collegate fra loro orizzontalmente.
Alberi autoaggiustanti Un albero bilanciato mantiene esplicitamente una condizione di bilanciamento (basata sul fattore di bilanciamento dei nodi) in modo da ottenere un tempo di esecuzione logaritmico nel caso peggiore per tutte le operazioni. Un albero autoaggiustante garantisce tempo di esecuzione AMMORTIZZATO logaritmico su una sequenza di operazioni senza mantenere alcuna condizione esplicita di bilanciamento 6
L’operazione di SPLAY Operazione splay(u): consiste nel partire da u e risalire alla radice dell’albero tramite una sequenza di rotazioni. A meno di simmetrie si ha se p(u) = r e u è fs, u diviene nuova radice e r fd (rotazione destra) se u è fs di p(u) e p(u) è fs di p(p(u)) allora u prende il posto di p(p(u)) con fd p(u) che a sua volta ha p(p(u)) come fd (doppia rotazione destra) se u è fs di p(u) e p(u) è fd di p(p(u)) allora u prende il posto di p(p(u)) che diviene suo fs mentre p(u) diviene suo fd (rotazione destra/sinistra) Ovviamente ad ogni passo si debbono mantenere le proprietà di un albero di ricerca. 7
L’euristica Per rendere un albero binario di ricerca auto-aggiustante,si itera splay(u) in corrispondenza di ogni operazione di accesso o di modifica dell’albero (da cui splay tree) . Quindi u inizialmente sarà: chiave trovata o foglia su cui ci si ferma (operazione di ricerca) elemento inserito (operazione di inserimento) padre dell’elemento v eliminato (operazione di cancellazione) L’euristica prosegue fino alla radice e pertanto in ogni caso è proporzionale alla lunghezza del cammino su cui lo splay procede 8
La funzione potenziale (T) = r(x) = log size(x), per ogni x nello splay tree. Il valore del potenziale è tanto più piccolo quanto più l’albero è bilanciato (T)= log5+ log3+ 3log1≈ 3.9 (T)= log5+ log4+ …+log1≈ 5.9 9
Analisi ammortizzata su splay tree Il tempo totale ammortizzato di una sequenza di operazioni (di ricerca, di inserimento e di cancellazione) su uno splay-tree è data da ( logn), con n massimo numero di nodi che l’albero raggiunge durante la sequenza. Il tempo ammortizzato di una singola operazione di splay è pari (logm), con m numero di nodi dell’albero su cui si effettua l’operazione. 10
Analisi ammortizzata di un singolo passo di splay u fs di p(u) e r = p(u) i= ci+(Ti)-(Ti-1)= per (1,2) = 1+ri(u)+ri(p(u)) -ri-1(u)-ri-1(p(u)) = per (3) = 1+ri(u)+ri(p(u)) -ri-1(u)- ri(u) = = 1+ ri(p(u)) -ri-1(u)≤ ≤ 1+ri(u) -ri-1(u) ≤ ≤ 1 + 3[ri(u) - ri-1(u)] u,p(u) sono gli unici nodi che cambiano il valore di size prima e dopo l’operazione di splay; ci misura il numero di rotazioni; ri-1(p(u)) = ri(u) 11