dizionari alberi bilanciati maggio 2002 ASD 2002 Alberi
dizionari alberi bilanciati maggio 2002 ASD 2002 - Alberi bilanciati
dizionari n ADT che supportano le seguenti operazioni n membership n n n insert delete n n anche detta search o remove le liste e i BST sono dizionari maggio 2002 ASD 2002 - Alberi bilanciati 2
dizionari/2 n n tutte le implementazioni finora considerate hanno almeno un’operazione di costo lineare w. c. t. (worst case time, tempo nel caso peggiore) in molti casi un costo lineare è giudicato inaccettabile n strutture più efficienti? n n maggio 2002 alberi bilanciati tavole hash ASD 2002 - Alberi bilanciati 3
introduzione al bilanciamento n nozione intuitiva di bilanciamento n n n tutti i rami di un albero hanno approssimativamente la stessa lunghezza ciascun nodo interno ha “molti” figli caso ideale per un albero k-ario n n ciascun nodo ha 0 o k figli la lunghezza di due rami qualsiasi differisce di al più una unità maggio 2002 ASD 2002 - Alberi bilanciati 4
bilanciamento perfetto 34 21 16 6 n 63 30 43 72 18 28 32 37 52 un albero binario perfettamente bilanciato di n nodi ha altezza se ogni nodo ha 0 o 2 figli nf = ni +1 nf = # foglie ni = # nodi interni n = nf + ni -1 foglia + 1 nodo interno le foglie sono circa il 50% dei nodi +2 foglie maggio 2002 ASD 2002 - Alberi bilanciati 5
bilanciamento perfetto/2 n facilmente generalizzabile ad alberi di arità k n n n costo di ricerca/inserimento/eliminazione O(log n) ripetuti inserimenti/eliminazioni possono distruggere il bilanciamento n degrado delle prestazioni maggio 2002 ASD 2002 - Alberi bilanciati 6
bilanciamento in altezza n n 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 n da Adel’son-Vel’skii & Landis, primi proponenti maggio 2002 ASD 2002 - Alberi bilanciati 7
fattore di bilanciamento 34 21 63 16 6 3 30 43 72 18 28 32 37 52 29 fattore di bilanciamento (FDB): altezza sottoalbero dx – altezza sottoalbero sx 78 57 +1 -1 0 in un albero bilanciato in altezza |FDB| 1, per ogni nodo maggio 2002 ASD 2002 - Alberi bilanciati 8
alberi AVL? maggio 2002 ASD 2002 - Alberi bilanciati 9
alberi di Fibonacci n alberi AVL col minimo numero di nodi (fissata l’altezza) h Fh AVLh 1 2 4 7 12 maggio 2002 ASD 2002 - Alberi bilanciati 0 0 0 1 1 1 2 3 2 4 4 3 7 5 5 12 6 8 20 7 13 33 10
alberi di Fibonacci/2 alberi di Fibonacci alberi bilanciati di altezza i col minimo numero di nodi AVLi +2 AVLi maggio 2002 AVLi +1 Relazioni AVLi +2 = AVLi +1 + 1 Fi +2 = Fi +1 AVLi = Fi +2 – 1 ASD 2002 - Alberi bilanciati 11
alberi di Fibonacci/3 n un albero di Fibonacci ha tutti i fattori di bilanciamento dei nodi interni pari a ± 1 n n è l’albero bilanciato più vicino alla condizione di non bilanciamento un albero di Fibonacci con n nodi ha altezza < 1. 44 lg(n +2) – 0. 328 n dimostrato da Adel’son-Vel’skii & Landis n un AVL di n nodi ha altezza (lg n) maggio 2002 ASD 2002 - Alberi bilanciati 12
inserimento in AVL 1. inserire nuovo nodo come in un BST “classico” il nuovo nodo diviene una foglia 2. ricalcolare i fattori di bilanciamento che 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” maggio 2002 ASD 2002 - Alberi bilanciati 13
rotazioni negli AVL casi possibili n n DD: inserimento nel sottoalbero destro di un figlio destro (del nodo che si sbilancia) SD: inserimento nel sottoalbero sinistro di un figlio destro (del nodo che si sbilancia) DS: inserimento nel sottoalbero destro di un figlio sinistro (del nodo che si sbilancia) SS: inserimento nel sottoalbero sinistro di un figlio sinistro (del nodo che si sbilancia) maggio 2002 ASD 2002 - Alberi bilanciati 14
rotazione semplice (caso DD) n gli antenati di P non sono interessati all’inserimento perché in seguito alla rotazione recuperano il loro fattore di bilanciamento precedente maggio 2002 ASD 2002 - Alberi bilanciati 15
rotazione doppia (caso SD) P P +1 +2 +2 +2 Q Q 0 Q -1 h R -1 h +2 h h +1 h h 0 h h h+1 0 P h h-1 R -1 0 h-1 maggio 2002 h Q h n h Q h-1 h h gli antenati di P non sono interessati all’inserimento ASD 2002 - Alberi bilanciati 16
rappresentazione nodo class Avl. Node { Comparable element; Avl. Node left; Avl. Node right; int height; Avl. Node(Comparable el) { this(el, null); } Avl. Node(Comparable el, Avl. Node lt, Avl. Node rt) { element = el; left = lt; right = rt; height = 0; } maggio ASD 2002 - Alberi bilanciati 17 } 2002
algoritmo inserimento /1 Avl. Node insert(Comparable x, Avl. Node t) { if(t == null) t = new Avl. Node(x, null); else if(x. compare. To(t. element) < 0) { t. left = insert(x, t. left); if(height(t. left) - height(t. right) == 2) if(x. compare. To(t. left. element) < 0) t = rotate. With. Left. Child(t); // SS else t = double. With. Left. Child(t); // DS maggio 2002 } else … ASD 2002 - Alberi bilanciati 18
algoritmo inserimento /2 … else if(x. compare. To(t. element) > 0) { t. right = insert(x, t. right); if(height(t. right) - height(t. left) == 2) if(x. compare. To(t. right. element) > 0) t = rotate. With. Right. Child(t); // DD else t = double. With. Right. Child(t); // SD } else ; // Duplicate; do nothing t. height=max(height(t. left), height(t. right) )+1; return t; } 2002 maggio ASD 2002 - Alberi bilanciati 19
rotazione semplice (SS) Avl. Node rotate. With. Left. Child(Avl. Node k 2) { Avl. Node k 1 = k 2. left; k 2. left = k 1. right; k 1. right = k 2; k 2. height = max(height(k 2. left), height(k 2. right)) + 1; k 1. height = max(height(k 1. left), k 2. height ) + 1; return k 1; } maggio 2002 ASD 2002 - Alberi bilanciati 20
rotazione doppia (SD) Avl. Node double. With. Right. Child(Avl. Node k 1){ k 1. right=rotate. With. Left. Child(k 1. righ t); return rotate. With. Right. Child(k 1); } maggio 2002 ASD 2002 - Alberi bilanciati 21
inserimento negli AVL/costo n n n 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 ASD 2002 - Alberi bilanciati 22
cancellazione negli AVL 1. 2. cancellare nodo come in un BST “classico” ricalcolare i fattori di bilanciamento che 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 maggio 2002 ASD 2002 - Alberi bilanciati 23
rotazione semplice n eliminazione foglia da sottoalbero sinistro di P n n il figlio destro ha FDB +1; a), b) e c) il figlio destro ha FDB 0; d), e) ed f) maggio 2002 ASD 2002 - Alberi bilanciati 24
rotazione doppia n eliminazione foglia da sottoalbero sinistro di P n n FDB(Q) = – 1 e FDB(R)= – 1; g), h) ed i) rotazione R-Q (P resta a +2, R e Q vanno a +1) e rotazione P-R maggio 2002 ASD 2002 - Alberi bilanciati 25
rotazione doppia/2 n eliminazione foglia da sottoalbero sinistro di P n n FDB(Q) = -1, FDB(R)=+1, j), k) ed l) rotazione R-Q (P resta a +2, R va a +2 e Q va a 0) e rotazione P-R maggio 2002 ASD 2002 - Alberi bilanciati 26
cancellazione negli AVL/costo n n 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) passo 3: (lg n) · (1) in totale: (lg n) maggio 2002 ASD 2002 - Alberi bilanciati 27
cancellazione negli AVL/esempio animazione tratta dal sito Web http: //www. seanet. com/users/arsen/avltree. html maggio 2002 ASD 2002 - Alberi bilanciati 28
- Slides: 28