dizionari dizionari alberi bilanciati! ADT ce supportano le seguenti operazioni! membersip! ance detta searc! insert! delete! o remove! le liste e i BST sono dizionari maggio 2002 ASD2002 - Alberi bilanciati 2 dizionari/2 introduzione al bilanciamento! tutte le implementazioni finora considerate anno almeno un operazione di costo lineare w.c.t. (worst case time, tempo nel caso peggiore)! in molti casi un costo lineare è giudicato inaccettabile! strutture più efficienti?! alberi bilanciati! tavole as! nozione intuitiva di bilanciamento! tutti i rami di un albero anno approssimativamente la stessa lungezza! ciascun nodo interno a molti figli! caso ideale per un albero k-ario! ciascun nodo a 0 o k figli! la lungezza di due rami qualsiasi differisce di al più una unità maggio 2002 ASD2002 - Alberi bilanciati 3 maggio 2002 ASD2002 - Alberi bilanciati 4
bilanciamento perfetto bilanciamento perfetto/2 foglie 34 21 63 16 30 6 18 28 32 43 72 37 52 foglia + 1 nodo interno! un albero binario perfettamente bilanciato di n nodi a altezza lg 2 n +! " 1 se ogni nodo a 0 o 2 figli n f = n i +1 n f = # foglie n i = # nodi interni n = n f + n i le foglie sono circa il 50% dei nodi! facilmente generalizzabile ad alberi di arità k! ( k! 1) n + 1 n = ( k! 1) ni + 1 " n = f f k! costo di ricerca/inserimento/eliminazione O(log n)! ripetuti inserimenti/eliminazioni possono distruggere il bilanciamento! degrado delle prestazioni maggio 2002 ASD2002 - Alberi bilanciati 5 maggio 2002 ASD2002 - Alberi bilanciati 6 bilanciamento in altezza fattore di bilanciamento! un albero è bilanciato in altezza se le altezze dei sottoalberi sinistro e destro di ogni nodo differiscono di al più un unità! gli alberi bilanciati in altezza sono detti alberi AVL! da Adel son-vel skii & Landis, primi proponenti 34 21 63 16 30 6 18 28 32 43 72 37 52 3 29 57 in un albero bilanciato in altezza FDB! 1, per ogni nodo 78 fattore di bilanciamento (FDB): altezza sottoalbero dx altezza sottoalbero sx +1 0 maggio 2002 ASD2002 - Alberi bilanciati 7 maggio 2002 ASD2002 - Alberi bilanciati 8
alberi AVL? alberi di Fibonacci maggio 2002 ASD2002 - Alberi bilanciati 9! alberi AVL col minimo numero di nodi (fissata l altezza) F AVL 0 0 0 1 2 1 1 1 4 2 1 2 3 2 4 4 3 7 5 5 12 7 6 8 20 12 7 13 33 maggio 2002 ASD2002 - Alberi bilanciati 10 alberi di Fibonacci/2 alberi di Fibonacci/3 AVL i AVL i +1 alberi di Fibonacci alberi bilanciati di altezza i col minimo numero di nodi AVL i Relazioni AVL i = AVL i + AVL i +1 + 1 F i = F i + F i +1 AVL i = F i 1! un albero di Fibonacci a tutti i fattori di bilanciamento dei nodi interni pari a ± 1! è l albero bilanciato più vicino alla condizione di non bilanciamento! un albero di Fibonacci con n nodi a altezza < 1.44 lg(n ) 0.328! dimostrato da Adel son-vel skii & Landis " # un AVL di n nodi a altezza $(lg n) maggio 2002 ASD2002 - Alberi bilanciati 11 maggio 2002 ASD2002 - Alberi bilanciati 12
inserimento in AVL rotazioni negli AVL 1. inserire nuovo nodo come in un BST classico il nuovo nodo diviene una foglia 2. ricalcolare i fattori di bilanciamento ce sono mutati in seguito all inserimento solo nel ramo interessato all inserimento (gli altri fattori non possono mutare), dal basso verso l alto 3. se nel ramo appare un fattore di bilanciamento pari a ±2 occorre ribilanciare tramite rotazioni casi possibili! DD: inserimento nel sottoalbero destro di un figlio destro (del nodo ce si sbilancia)! SD: inserimento nel sottoalbero sinistro di un figlio destro (del nodo ce si sbilancia)! DS: inserimento nel sottoalbero destro di un figlio sinistro (del nodo ce si sbilancia)! SS: inserimento nel sottoalbero sinistro di un figlio sinistro (del nodo ce si sbilancia) maggio 2002 ASD2002 - Alberi bilanciati 13 maggio 2002 ASD2002 - Alberi bilanciati 14 rotazione semplice (caso DD)! gli antenati di non sono interessati all inserimento percé in seguito alla rotazione recuperano il loro fattore di bilanciamento precedente maggio 2002 ASD2002 - Alberi bilanciati 15 +1 rotazione doppia (caso SD) 0 0 R 0 +1 maggio 2002 ASD2002 - Alberi bilanciati 16 +1 R! gli antenati di non sono interessati all inserimento 0
rappresentazione nodo algoritmo inserimento /1 class AvlNode { Comparable element; AvlNode left; AvlNode rigt; int eigt; AvlNode(Comparable el) { tis(el, null, null); AvlNode(Comparable el, AvlNode lt,avlnode rt) { element = el; left = lt; rigt = rt; eigt = 0; maggio 2002 ASD2002 - Alberi bilanciati 17 AvlNode insert(comparable x, AvlNode t) { if(t == null) t = new AvlNode(x, null, null); else if(x.compareto(t.element) < 0) { t.left = insert(x, t.left); if(eigt(t.left) - eigt(t.rigt) == 2) if(x.compareto(t.left.element) < 0) t = rotatewitleftcild(t); // SS else t = doublewitleftcild(t); // DS else maggio 2002 ASD2002 - Alberi bilanciati 18 algoritmo inserimento /2 rotazione semplice (SS) else if(x.compareto(t.element) > 0) { t.rigt = insert(x, t.rigt); if(eigt(t.rigt) - eigt(t.left) == 2) if(x.compareto(t.rigt.element) > 0) t = rotatewitrigtcild(t); // DD else t = doublewitrigtcild(t); // SD else ; // Duplicate; do noting t.eigt=max(eigt(t.left),eigt(t.rigt))+1; return t; restituisce la nuova radice AvlNode rotatewitleftcild(avlnode k2) { AvlNode k1 = k2.left; k2.left = k1.rigt; k1.rigt = k2; k2.eigt = max(eigt(k2.left), eigt(k2.rigt)) + 1; k1.eigt = max(eigt(k1.left), k2.eigt ) + 1; return k1; maggio 2002 ASD2002 - Alberi bilanciati 19 maggio 2002 ASD2002 - Alberi bilanciati 20
rotazione doppia (SD) inserimento negli AVL/costo AvlNode doublewitrigtcild(avlnode k1){ k1.rigt=rotatewitleftcild(k1.rigt); return rotatewitrigtcild(k1);! passo 1: proporzionale all altezza dell albero $(lg n) " passo 2: proporzionale all altezza dell albero $(lg n) " passo 3: O(lg n) in totale: $(lg n) maggio 2002 ASD2002 - Alberi bilanciati 21 maggio 2002 ASD2002 - Alberi bilanciati 22 cancellazione negli AVL rotazione semplice 1. cancellare nodo come in un BST classico 2. ricalcolare i fattori di bilanciamento ce sono mutati in seguito alla cancellazione solo nel ramo interessato all inserimento (gli altri fattori non possono mutare), dal basso verso l alto 3. per ogni nodo con fattore di bilanciamento pari a ±2 occorre operare una rotazione semplice o doppia O(lg n) rotazioni nel caso peggiore! eliminazione foglia da sottoalbero sinistro di! il figlio destro a FDB +1; a), b) e c)! il figlio destro a FDB 0; d), e) ed f) maggio 2002 ASD2002 - Alberi bilanciati 23 maggio 2002 ASD2002 - Alberi bilanciati 24
rotazione doppia rotazione doppia/2! eliminazione foglia da sottoalbero sinistro di! FDB() = 1 e FDB(R)= 1; g), ) ed i)! rotazione R- ( resta a, R e vanno a +1) e rotazione -R! eliminazione foglia da sottoalbero sinistro di! FDB() =, FDB(R)=+1, j), k) ed l)! rotazione R- ( resta a, R va a e va a 0) e rotazione -R maggio 2002 ASD2002 - Alberi bilanciati 25 maggio 2002 ASD2002 - Alberi bilanciati 26 cancellazione negli AVL/costo cancellazione negli AVL/esempio! nel caso peggiore occorre effettuare rotazioni (semplici o doppie) lungo tutto il ramo! passo 1: proporzionale all altezza dell albero $(lg n) " passo 2: proporzionale all altezza dell albero $(lg n) animazione tratta dal sito Web ttp://www.seanet.com/users/arsen/avltree.tml " passo 3: $(lg n) $(1) in totale: $(lg n) maggio 2002 ASD2002 - Alberi bilanciati 27 maggio 2002 ASD2002 - Alberi bilanciati 28