La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

RB-alberi (Red-Black trees) Proprietà degli RB-alberi Rotazioni Inserimento Rimozione.

Presentazioni simili


Presentazione sul tema: "RB-alberi (Red-Black trees) Proprietà degli RB-alberi Rotazioni Inserimento Rimozione."— Transcript della presentazione:

1 RB-alberi (Red-Black trees) Proprietà degli RB-alberi Rotazioni Inserimento Rimozione

2 Proprietà degli RB-alberi Un RB-albero (Red-black tree) è un albero binario di ricerca dove ogni nodo ha in aggiunta un campo per memorizzare il suo colore: RED (rosso) o BLACK (nero). La colorazione avviene mediante regole precise, che assicurano che nessun cammino dalla radice ad una foglia risulti lungo più del doppio di qualsiasi altro. Si ottiene così che lalbero è abbastanza bilanciato. Ciascun nodo dellalbero contiene i campi color, key, left, right, e p.

3 Proprietà degli RB-alberi Un RB-albero (red-black tree) soddisfa le seguenti proprietà: 1.Ciascun nodo è rosso o nero. 2.Ciascuna foglia (NIL) è nera. 3.Se un nodo è rosso allora entrambi i suoi figli sono neri. 4.Ogni cammino da un nodo ad una foglia sua discendente contiene lo stesso numero di nodi neri. Dalla proprietà 4 si definisce la b-altezza di un nodo x. bh(x) = numero di nodi neri su un cammino da un nodo x, non incluso, ad una foglia sua discendente. Nota: Un nodo nero può avere figli rossi o neri. Tutti i nodi interni hanno due figli.

4 Red-Black Albero root[T] NIL

5 Altezza di RB-albero Un RB-albero con n nodi interni ha unaltezza di al più 2 lg(n+1). Dim.: Si ha che ogni sottoalbero con radice in x contiene almeno 2 bh(x) -1 nodi interni. Dimostrazione per induzione: Se bh(x)=0, x è una foglia e si ha =1-1=0. Supponiamo vera per bh(x)=k-1, allora consideriamo un nodo x con bh(x)=k e k>0. x è un nodo interno (k>0) e ha due figli con b-altezza bh(x) o bh(x)-1. Allora i nodi interni nel sottoalbero con radice in x sono almeno (2 bh(x)-1 -1)+(2 bh(x)-1 -1)+1= 2 bh(x) -1.

6 Altezza di RB-albero Dim. (prosegue): Sia h laltezza del RB-albero. Per la proprietà 3 almeno metà dei nodi sono neri. Quindi la b-altezza della radice è almeno h/2. Dunque, i nodi interni n sono almeno 2 h/ h/2 -1 n h 2 lg(n+1).

7 Operazioni su un RB-albero Le operazioni di SEARCH, PREDECESSOR, MINIMUM e MAXIMUM sono quelle viste per un albero binario di ricerca. Possono essere eseguite in un RB-albero con un tempo pari a O(h) = O(lg(n)). Le operazioni di INSERT e DELETE si complicano, poiché devono tener conto delle proprietà aggiuntive del RB-albero. Più precisamente si devono effettuare dei cambiamenti in modo da ripristinare le regole di colorazione dei nodi. Tuttavia, RB-INSERT() e RB-DELETE() possono essere eseguite in tempo O(lg(n)).

8 Rotazioni Le rotazioni sono delle operazioni che cambiano la struttura dei puntatori di due nodi (padre e figlio). E unoperazione locale dellalbero di ricerca che non modifica lordinamento delle chiavi. Questa operazione sono utilizzate da INSERT e DELETE per ripristinare le proprietà violate degli RB-alberi mantenendo lalbero sempre un albero binario di ricerca.

9 Rotazioni x y a b c y x a bc RIGHT-ROTATE(T,y) LEFT-ROTATE(T,x) a x b y c I due nodi interni x e y potrebbero essere ovunque nellalbero. Le lettere a, b e c rappresentano sottoalberi arbitrari. Unoperazione di rotazione mantiene lordinamento delle chiavi secondo la visita inorder.

10 Rotazioni LEFT-ROTATE(T,x) 1. y right[x] // inizializzazione di y 2. right[x] left[y]// inizio rotazione: sposta b 3. if left[y] NIL 4. then p[left[y]] x 5.p[y] p[x] // metti y al posto di x 6. if p[x] = NIL 7. then root[T] y // se x era la radice 8. else if x = left[p[x]] // modifica puntatore di p[x] 9. then left[p[x]] y 10. else right[p[x]] y 11. left[y] x// metti x a sinistra di y 12. p[x] y Si opera solo sui puntatori lasciando inalterati gli altri campi. RIGHT-ROTATE() è un procedura simmetrica. Entrambe le procedure sono eseguite in un tempo costante, quindi O(1).

11 Inserimento RB-INSERT(T,x) 1. TREE-INSERT(T,x)// ins. come albero b. di ricerca 2. color[x] RED// la proprietà 3 potrebbe essere violata p[x] = RED Si usa la procedura TREE-INSERT per inserire il nodo x nel RB-albero, visto che è un albero binario. Il nodo x viene colorato di rosso (i due figli NIL sono neri). Proprietà 1 e 2 sono soddisfatte: il nuovo nodo è rosso e ha due figli NIL neri. Proprietà 4 si mantiene il nuovo nodo è rosso e non aumenta la b-altezza fino ai suoi due figli neri. Potrebbe essere violata la proprietà 3, che dice che un nodo rosso non può avere figli rossi.

12 Inserimento 3. while x root[T] and color[p[x]] = RED // finché prop. 3 violata 4. do if p[x] = left[p[p[x]]]// 3 casi: p[x] sinistra di p[p[x]] 5. then y right[p[p[x]]] 6. if color[y] = RED // caso 1: p[x] e fratello y RED 7. then color[p[x]] BLACK// y zio di x 8. color[y] BLACK 9. color[p[p[x]]] RED 10. x p[p[x]] Il ciclo while continua ad essere eseguita finché la proprietà 3 risulta invariata: x e p[x] sono entrambi RED. Lo scopo è quello di far risalire nellalbero questa violazione, mentre tutte le altre proprietà rimangono valide. Dopo ogni iterazione: o il puntatore x risale lalbero o viene eseguita qualche rotazione ed il ciclo termina.

13 Inserimento Ci sono 3 casi + altri 3 simmetrici (la linea 4 li suddivide). Caso 1: y il fratello di p[x] è esso stesso RED. Quindi p[p[x]] è BLACK. x p[x] y p[p[x]] x p[x] y p[p[x]] Possibile nuova violazione tra p[p[x]] e suo padre: se entrambi RED!

14 Inserimento 11. else if x = right[p[x]]// caso 2: zio y BLACK 12. then x p[x]// e x a destra di p[x] 13. LEFT-ROTATE(T,x) Caso 2: lo zio di x è BLACK e x è figlio destro di p[x]. Quindi, p[p[x]] è BLACK (unica violazione: tra x e p[x]!). x p[x] y p[p[x]] LEFT-ROTATE(T,x) x y x y x p[x] a b c a b c Caso 3 bh(a) = bh(b) = bh(c)

15 Inserimento 14. color[p[x]] BLACK// caso 3: zio y BLACK 15. color[p[p[x]]] RED// e x a sinistra di p[x] 16. RIGHT-ROTATE(T,p[p[x]]) Caso 3: lo zio y di x è BLACK e x (RED) è figlio sinistro di p[x] (RED). Quindi, p[p[x]] è BLACK (unica violazione: tra x e p[x]!). p[p[x]] RIGHT-ROTATE(T,p[p[x]]) x y color[p[x]] B color[p[p[x]]] R p[x] p[p[x]] x y p[x] p[p[x]] x y p[x] c c c bh(a) = bh(b) = bh(c) = bh(y) abab ab

16 Inserimento Il Caso 2 si trasforma nel Caso 3. La proprietà 4 si preserva. A questo punto (Caso 3) si deve effettuare alcuni cambiamenti di colore ed una rotazione destra che preserva la proprietà 4. Dopo il Caso 3 il ciclo while non è più ripetuto, in quanto p[x] è nero. A questo punto tutte le proprietà sono rispettate.

17 Inserimento La linea 17 è linizio degli altri 3 Casi simmetrici. Il codice risulta uguale, basta scambiare right con left e viceversa. Lultima riga è importante: la radice risulta sempre nera. Se x non è la radice e p[x] risulta rosso, allora p[x] non è esso stesso la radice dellalbero e, quindi, esiste p[p[x]]. Questa condizione è fondamentale per il corretto funzionamento dellalgoritmo. 17. else (altri 3 Casi simmetrici: scambia right e left) 18. color[root[T]] BLACK // nel caso x risalga fino alla radice

18 Inserimento RB-INSERT(T,x) 1. TREE-INSERT(T,x)// ins. come albero b. di ricerca 2. color[x] RED// la proprietà 3 violata? 3. while x root[T] and color[p[x]] = RED // finché prop. 3 violata 4. do if p[x] = left[p[p[x]]]// 3 casi: p[x] sinistra di p[p[x]] 5. then y right[p[p[x]]] 6. if color[y] = RED // caso 1: p[x] e fratello y RED 7. then color[p[x]] BLACK// y zio di x 8. color[y] BLACK 9. color[p[p[x]]] RED 10. x p[p[x]] 11. else if x = right[p[x]]// caso 2: zio y BLACK 12. then x p[x]// e x a destra di p[x] 13. LEFT-ROTATE(T,x) 14. color[p[x]] BLACK// caso 2: zio y BLACK 15. color[p[p[x]]] RED// e x a sinistra di p[x] 16. RIGHT-ROTATE(T,p[p[x]]) 17. else (altri 3 Casi simmetrici: scambia right e left) 18. color[root[T]] BLACK // nel caso x risalga fino alla radice

19 Inserimento Analisi del tempo di esecuzione: Dato che laltezza di un RB-albero di n nodi è O(lg(n)), la chiamata TREE-INSERT() costa tempo O(lg(n)). Il ciclo while è ripetuto solo se si esegue il Caso 1 con il conseguente spostamento verso la radice di x. Per cui il numero massimo di volte che il ciclo while può essere ripetuto è O(lg(n)). Ogni ciclo while è eseguito in tempo costante. Quindi, RB-INSERT() impiega un tempo totale pari a O(lg(n)).

20 Inserimento Un esempio pratico root[T] NIL RB-INSERT(T,x) key[x] = NIL

21 Inserimento Un esempio pratico root[T] NIL Caso 1 5 NIL Proprietà 3 violata x NIL y

22 Inserimento Un esempio pratico root[T] NIL Caso 2 5 NIL Proprietà 3 violata x y 8

23 Inserimento Un esempio pratico root[T] NIL Caso 3 5 NIL Proprietà 3 violata x y 8

24 Inserimento Un esempio pratico root[T] NIL Nota: lalbero è più bilanciato! 5 NIL 8

25 Rimozione La rimozione di un nodo da un RB-albero è un po più complicata dellinserimento. Per semplificare il codice si fa uso di una sentinella nil[T] al posto di ogni foglia NIL. Il colore di nil[T] è BLACK, mentre gli altri campi (p, left, right, key) sono arbitrari. Tutti i puntatori a NIL sono sostituiti con puntatori a nil[T]. Il vantaggio è quello di poter trattare nil[T] come un nodo e poter quindi assegnare il valore p[nil[T]] necessario per il corretto funzionamento dellalgoritmo.

26 Rimozione RB-DELETE(T,z) 1. if left[z] = nil[T] o right[z] = nil[T] 2. then y z // z ha 0 o 1 figlio 3. else y TREE-SUCCESSOR(z) // z ha due figli, trova succ(z) 4. if left[y] nil[T] // x punta ad eventuale 5. then x left[y] // unico figlio di y, altrimenti a nil[T] 6. else x right[z] 7. p[x] p[y] // taglia fuori y 8. if p[y] = nil[T] 9. then root[T] x // se y è la radice 10. else if y = left[p[y]] // altrimenti 11. then left[p[y]] x // completa eliminazione di y 12. else right[p[y]] x 13. if y z // se y è il successore 14. then key[z] key[y] // copia y in z 15. copia anche altri attributi di y in z 16. if color[y] = BLACK// chiama fixup se proprietà then RB-DELETE-FIXUP(T,x)// risulta violata 18. return y

27 Inserimento Un esempio pratico root[T] NIL RB-DELETE(T,x) con key[x] = z = y

28 Inserimento Un esempio pratico root[T] NIL RB-DELETE(T,x) con key[x] = 2 5 8

29 Rimozione La rimozione di un nodo da un RB-albero è una semplice modifica della procedura TREE-DELETE. Dopo aver rimosso il nodo y, si chiama RB-DELETE-FIXUP se color[y] è BLACK. Questo perché viene eliminato un nodo interno nero e la proprietà 4 sulla b-altezza non è più valida. In RB-DELETE-FIXUP(T,x) si considera che x abbia un colore nero doppio, cioè pari a 2. La proprietà 4 risulta cosi soddisfatta. Lo scopo è di spostare il colore nero di troppo verso la radice in modo da eliminarlo.

30 Rimozione RB-DELETE-FIXUP(T,x) 1. while x root[T] and color[x] = BLACK // spingi su BLACK extra verso radice 2. do if x = left[p[x]]// 4 casi se x = left[p[x]] 3. then w right[p[x]] 4. if color[w] = RED// caso 1 5. then color[w] BLACK// fratello RED 6. color[p[x]] RED 7. LEFT-ROTATE(T, p[x]) 8. w right[p[x]] AD x B C E w Caso 1 ab cdef Nero per color[w] A D x B C E w ab cd e f Nero doppio Caso 2, 3 o 4

31 Rimozione 9. if color[left[w]] = BLACK and color[right[w]] = BLACK 10. then color [w] RED// caso 2: w BLACK 11. x p[x]// figli di w BLACK Caso 2 A D x B C E w ab cd e f Nero doppio A D nuovo x B C E ab cd e f Aggiungi colore nero Se il nuovo p[x] è RED il ciclo while termina. Per esempio, se si passa dal Caso 1 al Caso 2, il nuovo x (p[x]) è RED.

32 Rimozione 12. else if color [right[w]] = BLACK// caso 3: w BLACK, left[w] RED 13. then color[left[w]] BLACK// right[w] BLACK 14. color[w] RED 15. RIGHT-ROTATE(T,w) 16. w right[p[x]] Caso 3 A D x B C E w ab cd e f Nero doppio A C B E D ab ef d c Si è trasformato il Caso 3 nel Caso 4. x nuovo w Caso 4 Nero doppio

33 Rimozione 17. color[w] color[p[x]] // caso 4: w BLACK 18. color[p[x]] BLACK// right[w] RED 19. color[p[x]] BLACK 20. LEFT-ROTATE(T,p[x]) 21. x root[T] // per terminare il ciclo e assicurarsi che root sia BLACK Caso 4 A D x B C E w ab cd e f Nero doppio E B due neri D A C w ef ab c d cpx = color[p[x]] color cpx nuovo x = root[T]

34 Rimozione RB-DELETE-FIXUP(T,x) 1. while x root[T] and color[x] = BLACK // spingi su BLACK extra verso radice 2. do if x = left[p[x]]// 4 casi se x = left[p[x]] 3. then w right[p[x]] 4. if color[w] = RED// caso 1: w RED 5. then color[w] BLACK// fratello RED 6. color[p[x]] RED 7. LEFT-ROTATE(T, p[x]) 8. w right[p[x]] 9. if color[left[w]] = BLACK and color[right[w]] = BLACK 10. then color [w] RED// caso 2: w BLACK 11. x p[x]// figli di w BLACK

35 Rimozione 12. else if color [right[w]] = BLACK// caso 3: w BLACK 13. then color[left[w]] BLACK// right[w] BLACK 14. color[w] RED 15. RIGHT-ROTATE(T,w) 16. w right[p[x]] 17. color[w] color[p[x]] // caso 4: w BLACK 18. color[p[x]] BLACK// right[w] RED 19. color[p[x]] BLACK 20. LEFT-ROTATE(T,p[x]) 21. x root[T] // per terminare il ciclo e assicurarsi che root sia BLACK 22. else (analogo con right e left scambiati) 23. color[x] BLACK

36 Rimozione In tutti i quattro casi (+ gli i 4 simmetrici) la proprietà 4 si mantiene dopo le modifiche, ossia il numero di nodi neri dalla radice a ognuno dei sottoalberi a, b, c,d, e ed f rimane identico dopo la trasformazione. Tempo di esecuzione: Data laltezza dellalbero è pari a O(lg(n)), la chiamata di RB- DELETE() senza considerare RB-DELETE-FIXUP() ha un costo di O(lg(n)) (vedi rimozione in un albero binario). In RB-DELETE-FIXUP(), il Caso 1 si riconduce ai Casi 2, 3 o 4 in tempo costante. I Casi 3, e 4 fanno terminare la procedura dopo lesecuzione di un numero costante di passi.

37 Rimozione Il Caso 2 è lunico per il quale si potrebbe ripetere lesecuzione del ciclo while. Questo può avvenire al più O(lg(n)) volte. Quindi la procedura RB-DELETE-FIXUP() impegna un tempo O(lg(n)) ed esegue al più tre rotazioni. Il tempo di esecuzione complessivo della procedura RB- DELETE() risulta O(lg(n)). Su un RB-albero le operazioni di SEARCH, PREDECESSOR, MINIMUM, MAXIMUM, INSERT e DELETE sono tutte O(lg(n)).


Scaricare ppt "RB-alberi (Red-Black trees) Proprietà degli RB-alberi Rotazioni Inserimento Rimozione."

Presentazioni simili


Annunci Google