La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Algoritmi e Strutture Dati Alberi Bilanciati: Alberi Red-Black.

Presentazioni simili


Presentazione sul tema: "Algoritmi e Strutture Dati Alberi Bilanciati: Alberi Red-Black."— Transcript della presentazione:

1 Algoritmi e Strutture Dati Alberi Bilanciati: Alberi Red-Black

2 Alberi Red-Black (alberi rossi-neri) Un Albero Red-Black (rosso-nero) è essenzialmente un albero binario di ricerca in cui: 1Le chiavi vengono mantenute solo nei nodi interni dellalbero 2Le foglie sono costituite da nodi NIL, cioè nodi sentinella il cui contenuto è irrilevante e che evitano di trattare diversamente i puntatori ai nodi dai puntatori NIL. In altre parole, al posto di un puntatore NIL si usa un puntatore ad un nodo NIL. Quando un nodo ha come figli nodi NIL, quiel nodo sarebbe una foglia nellalbero binario di ricerca corrispondente.

3 Alberi Red-Black (alberi rossi-neri) Un Albero Red-Black (rosso-nero) deve soddisfare le seguenti proprietà (vincoli): 1Ogni nodo è colorato o di rosso o di nero; 2Per convezione, i nodi NIL si considerano nodi neri; 3Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL (figlio di una foglia) ha lo stesso numero di nodi neri;

4 Alberi Red-Black (alberi rossi-neri) Un Albero Red-Black (rosso-nero) deve soddisfare le seguenti proprietà (vincoli): 1Ogni nodo è colorato o di rosso o di nero; 2Per convezione, i nodi NIL si considerano nodi neri; 3Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL (figlio di una foglia) ha lo stesso numero di nodi neri; Considereremo solo alberi Red-Black in cui la radice è nera.

5 Alberi Red-Black: esempio I 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil

6 Alberi Red-Black: esempio I 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Vincolo 3 impone che non possano esserci due nodi ROSSI adiacenti. (Ma più nodi NERI possono essere adiacenti.)

7 Alberi Red-Black: esempio I 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Ci sono 3 nodi neri lungo ogni percorso dalla radi- ce ad un nodo NIL

8 Alberi Red-Black: esempio I Nil Questo è anche un albero AVL 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri. altezza 2 altezza 3 1 livello di diff. 5 Nil

9 Alberi Red-Black: esempio II Nil 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri. Questo è ancora un albero Red-Black

10 Alberi Red-Black: esempio II Ma NON è un albero AVL! Nil 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri. 2 livelli altezza 1 altezza 3 Nil 10 Nil

11 Alberi Red-Black: esempio I 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Ci sono 3 nodi neri lungo ogni percorso dalla radi- ce ad un nodo NIL

12 Alberi Red-Black: esempio III 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Ci sono 3 nodi neri lungo ogni percorso dalla radi- ce ad un nodo NIL

13 Alberi Red-Black: esempio IV 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Albero RB con 3 nodi neri lungo ogni percorso dalla radice ad un nodo NIL

14 Alberi Red-Black: esempio V 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Stesso albero con 2 nodi neri lungo ogni percorso dalla radice ad un nodo NIL

15 Alberi Red-Black: esempio VI 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Questo albero può essere un albero Red-Black? Nil 85 Nil

16 Alberi Red-Black: esempio VI 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso! Nil 85 Nil

17 Alberi Red-Black: esempio VI 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso! Nil 85 Nil Impossibile! Perché...

18 Alberi Red-Black: esempio VI 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso! Nil 85 Nil Impossibile! Perché dovremmo violare vincolo 3

19 Alberi Red-Black: esempio VI 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso! Nil 85 Nil Quindi uno di questi due nodi deve essere rosso

20 Alberi Red-Black: esempio VI 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Nil 85 Nil Esistono due percorsi con 2 soli nodi neri Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso!

21 Alberi Red-Black: esempio VI 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Nil 85 Nil Esiste un percorso con 2 soli nodi neri Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso!

22 Alberi Red-Black: esempio VI 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Nil 85 Nil Esiste un percorso con 2 soli nodi neri Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso! Questo caso è impossibile perchè un percorso ha 3 neri

23 Alberi Red-Black: esempio VI 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Per vincolo 4 e il vincolo 3, ci possono essere al più 2 nodi neri lungo un percorso! Nil 85 Nil

24 Alberi Red-Black: esempio VI 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Per vincolo 4 e il vincolo 3, ci possono essere al più 2 nodi neri lungo un percorso! Nil 85 Nil Questa sarebbe lunica possibilità!

25 Alberi Red-Black: esempio VI 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Per vincolo 4 e il vincolo 3, ci possono essere al più 2 nodi neri lungo un percorso! Nil 85 Nil Impossibile! Perché dovremmo violare vincolo 4

26 Alberi Red-Black: esempio VI 3 Se un nodo è rosso, allora entrambi i suoi figli sono neri; 4 Ogni percorso da un nodo interno ad un nodo NIL ha lo stesso numero di nodi neri Nil Questo albero NON può essere un albero Red- Black! Nil 85 Nil A meno che lalbero non venga ristrutturato (tramite rotazioni)

27 Percorso Nero in alberi Red-Black Definizione: Il numero di nodi neri lungo ogni percorso da un nodo x (escluso) ad una foglia è detto altezza nera di x Definizione: Laltezza nera di un albero Red-Black è laltezza nera della sua radice.

28 Percorso massimo in alberi Red-Black Lemma: Un albero Red-Black con n nodi ha altezza al più 2 log(n + 1) Dimostrazione: Iniziamo col dimostrare per induzione che il sottoalbero con radice x ha almeno nodi interni dove bh(x) è laltezza nera di x. Linduzione sarà sullaltezza di x.

29 Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno nodi interni dove bh(x) è laltezza nera di x. Passo Base: Se x ha altezza 0: allora x è una foglia NIL e quindi contiene almeno:

30 Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno nodi interni dove bh(x) è laltezza nera di x. Passo Induttivo: Se x sia interno con 2 figli e abbia altezza bh(x)>1 Entrambi i suoi figli avranno altezza bh(x) o bh(x) bh(x) bh(x) bh(x) bh(x) -1

31 Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno nodi interni dove bh(x) è laltezza nera di x. Passo Induttivo: Sia x nodo interno con 2 figli e abbia altezza > 0 Entrambi i suoi figli avranno altezza nera bh(x) o bh(x)-1 Entrambi i suoi figli avranno altezza minore di x, quindi possiamo usare ipotesi induttiva bh(x) bh(x) bh(x) bh(x) -1

32 Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno nodi interni dove bh(x) è laltezza nera di x. Passo Induttivo: Se x sia interno con 2 figli e abbia altezza >0 Entrambi i suoi figli avranno altezza nera bh(x) o bh(x)-1 Ogni figlio avrà almeno nodi interni bh(x) bh(x) bh(x) bh(x) -1

33 Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno nodi interni dove bh(x) è laltezza nera di x. Passo Induttivo: Sia x nodo interno con 2 figli e abbia altezza >0 Ogni figlio avrà almeno nodi interni Quindi il sottoalbero con radice x conterrà almeno nodi interni

34 Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha quindi al meno nodi interni dove bh(x) è laltezza nera di x. Completiamo la dimostrazione del lemma. Sia ora h laltezza dellalbero. Per il vincolo 3 almeno metà dei nodi lungo ogni percorso (esclusa la radice) sono neri. Quindi laltezza nera dellalbero dovrà essere almeno h/2 ( cioè bh h/2 ).

35 Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno nodi interni dove bh(x) è laltezza nera di x. Completiamo la dimostrazione del lemma. Sia ora h laltezza dellalbero. Quindi laltezza nera dellalbero dovrà essere almeno h/2 ( cioè bh h/2 ). Ma allora, il numero di nodi dellalbero sarà

36 Percorso massimo in alberi Red-Black Lemma: Un albero Red-Black con n nodi ha altezza al più 2 log(n + 1) Dimostrazione: …. Completiamo la dimostrazione del lemma. Sia ora h laltezza dellalbero. Ma allora, il numero di nodi dellalbero sarà Portando 1 a sinistra e applicando il logaritmo: cioè

37 Costo operazioni su alberi Red-Black Teorema: In un albero Red-Black le operazioni di ricerca, inserimento e cancellazione hanno costo O(log(n)). Dimostrazione: Conseguenza diretta del Lemma precedente e dal fatto che tutte le operazioni hanno costo O(h), con h laltezza dellalbero.

38 Violazione delle proprietà per inserimento Durante la costruzione di un albero Red- Black, quando un nuovo nodo viene inserito è possibile che le condizioni di bilancia- mento risultino violate. Quando le proprietà Red-Black vengono violate si può agire: modificando i colori nella zona della violazione; operando dei ribilanciamenti dellalbero tramite rotazioni: Rotazione destra e Rotazione sinistra;

39 Alberi Red-Black: Rotazione destra sinistro key destro colore padre Nodo Rotazione col figlio destro Rotazione va da destra a sinistra Il libro la chiama Rotazione a Sinistra y x Padre del sottoalbero

40 Alberi Red-Black: Rotazione destra sinistro key destro colore padre Nodo Rotazione col figlio destro Rotazione va da destra a sinistra Il libro la chiama Rotazione a Sinistra y x Padre del sottoalbero

41 Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y sinistro key destro colore padre Nodo Assunzione: destro[x ] NIL Rotazione col figlio destro Rotazione va da destra a sinistra Il libro la chiama Rotazione a Sinistra

42 Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Alberi Red-Black: Rotazione destra y x Padre del sottoalbero

43 Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Alberi Red-Black: Rotazione destra y x Padre del sottoalbero

44 Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Alberi Red-Black: Rotazione destra y x Padre del sottoalbero

45 Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Alberi Red-Black: Rotazione destra y x Padre del sottoalbero

46 Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Alberi Red-Black: Rotazione destra y x Padre del sottoalbero

47 Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y y x Padre del sottoalbero

48 Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y y x Padre del sottoalbero

49 Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y y Padre del sottoalbero x

50 Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Padre del sottoalbero x y

51 Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Padre del sottoalbero x y

52 Inserimento in alberi Red-Black Inseriamo un nuovo nodo x usando la stessa procedura usata per gli alberi binari di ricerca Coloriamo il nuovo nodo di rosso Ci spostiamo verso lalto lungo il percorso di inserimento per ripristinare la proprietà Red- Black: spostiamo le violazioni verso lalto rispettando il vincolo 4 (mantenendo laltezza nera dellalbero) Al termine, coloriamo la radice di nero. Le operazioni di ripristino sono necessarie solo quando due nodi consecutivi sono rossi!

53 Inserimento in alberi Red-Black Le operazioni di ripristino sono necessarie solo quando due nodi consecutivi sono rossi! Se la radice è sempre nera, non si presenta mai la necessità di ribilanciare lalbero lungo percorsi che contengono meno di tre nodi! Non si possono, infatti, verificare violazioni! 5 3 Nil Nodo da inserire Radice

54 Ribilanciamenti: casi 1-3 C A D B x y B x C A D y caso 1 Caso 1: il figlio y del padre del padre di x è rosso x è il nodo modificato che provoca lo sbilanciamento Red-Black y è il figlio del padre del padre di x

55 Ribilanciamenti: casi 1-3 C A D B x y B x C A D y B x C A y caso 1 caso 2 Questa radice è nera Caso 2: il figlio y del padre del padre di x è nero x è un filgio destro

56 Ribilanciamenti: casi 1-3 C A D B x y B x C A D y B x C A y C B A x y caso 1 caso 2 caso 3 La radice di y è nera La radice di y è nera Caso 3: il figlio y del padre del padre di x è nero x è un filgio sinistro

57 Inserimento in alberi RB: Caso 1 Caso 1: il figlio y del padre del padre di x è rosso Tutti i sono sottoalberi di uguale altezza nera C A D B x y Cambiamo i colori di alcuni nodi, preservando vincolo 4: tutti i percorsi sotto a questi nodi hanno altezza nera uguale. Poi si continua verso lalto facendo del padre del padre di x il nuovo x caso 1 C A D B x

58 Inserimento in alberi RB: Caso 1 y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] Caso 1: il figlio y del padre del padre di x è rosso Tutti i sono sottoalberi di uguale altezza nera C A D B x y Cambiamo i colori di alcuni nodi, preservando vincolo 4: tutti i percorsi sotto a questi nodi hanno altezza nera uguale. Poi si continua verso lalto facendo del padre del padre di x il nuovo x

59 Inserimento in alberi RB: Caso 1 y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] C A D B C A D B y Cambiamo i colori di alcuni nodi, preservando vincolo 4: tutti i percorsi sotto hanno altezza nera uguale. Poi si continua verso lalto facendo del padre del padre di x il nuovo x caso 1 y x x Caso 1: il figlio y del padre del padre di x è rosso Tutti i sono sottoalberi di uguale altezza nera

60 Inserimento in alberi RB: Caso 1 y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] C A D B C A D B y Cambiamo i colori di alcuni nodi, preservando vincolo 4: tutti i percorsi sotto hanno altezza nera uguale. Poi si continua verso lalto facendo del padre del padre di x il nuovo x caso 1 y x x Poiché il padre di C può essere rosso, può essere necessario ripri- stinare la proprietà RB più in alto

61 B x Inserimento in alberi RB: Caso 1 C A D C A D y x Si eseguono le stesse azioni sia quando x è un figlio sinistro o un figlio destro B caso 1 y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] Caso 1: il figlio y del padre del padre di x è rosso Tutti i sono sottoalberi di uguale altezza nera

62 B x Inserimento in alberi RB: Caso 2 Caso 2: il figlio y del padre del padre di x è nero x è un filgio destro Trasformiamo nel caso 3 con una rotazione destra C A y Trasformiamo il caso 2 nel caso 3 (x è figlio sinistro) con una rotazione destra. Ciò preserva il vincolo 4: tutti i percorsi sotto x contengonolo stesso numero di nodi neri C B A x caso 2 y

63 B x Inserimento in alberi RB: Caso 2 IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) // continua con caso 3 Caso 2: il figlio y del padre del padre di x è nero x è un filgio destro Trasformiamo nel caso 3 con una rotazione destra C A y caso 2 Trasformiamo il caso 2 nel caso 3 (x è figlio sinistro) con una rotazione destra. Ciò preserva il vincolo 4: tutti i percorsi sotto x contengonolo stesso numero di nodi neri B x C A y

64 B x Inserimento in alberi RB: Caso 2 IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) // continua con caso 3 C A C B y A x caso 2 y Trasformiamo il caso 2 nel caso 3 (x è figlio sinistro) con una rotazione destra. Ciò preserva il vincolo 4: tutti i percorsi sotto x contengonolo stesso numero di nodi neri Caso 2: il figlio y del padre del padre di x è nero x è un filgio destro Trasformiamo nel caso 3 con una rotazione destra

65 Inserimento in alberi RB: Caso 3 Caso 3: il figlio y del padre del padre di x è nero x è un filgio sinistro Cambiare colori e rotazione sinistra caso 3 C B A x y Eseguiamo alcuni cambi di colore e facciamo una rotazione sinistra. Di nuovo, preserviamo il vincolo 4: tutti i percorsi sotto x contengono lo stesso numero di nodi neri. B A x C

66 Inserimento in alberi RB: Caso 3 colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) Caso 3: il figlio y del padre del padre di x è nero x è un filgio sinistro Cambiare colori e rotazione sinistra caso 3 C B A x y Eseguiamo alcuni cambi di colore e facciamo una rotazione sinistra. Di nuovo, preserviamo il vincolo 4: tutti i percorsi sotto x contengono lo stesso numero di nodi neri. C B A x y

67 Inserimento in alberi RB: Caso 3 colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) caso 3 C B A x y Eseguiamo alcuni cambi di colore e facciamo una rotazione sinistra. Di nuovo, preserviamo il vincolo 4: tutti i percorsi sotto x contengono lo stesso numero di nodi neri. C B A x y Questa radice è nera Caso 3: il figlio y del padre del padre di x è nero x è un filgio sinistro Cambiare colori e rotazione sinistra

68 Inserimento in alberi RB: Caso 3 colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) B A x caso 3 C B A x y C Eseguiamo alcuni cambi di colore e facciamo una rotazione sinistra. Di nuovo, preserviamo il vincolo 4: tutti i percorsi sotto x contengono lo stesso numero di nodi neri. y Questa radice è nera Caso 3: il figlio y del padre del padre di x è nero x è un filgio sinistro Cambiare colori e rotazione sinistra

69 Inserimento in alberi RB: Casi 4-6 I casi 1-3 assumono che il padre di x sia un figlio sinistro Se il padre di x è un figlio destro si applicano i casi 4-6 che sono simmetrici (scambiamo sinistro con destro e viceversa). Lestensione dellalgoritmo ai casi 4-6 è lasciato come esercizio

70 Inserimento in alberi Red-Black RB-Inserisci(T,x : albero-RB) ABR-Inserisci ( T,x ) colore[x] = ROSSO WHILE (x root[T] AND colore[padre[x]] = ROSSO) DO IF padre[x] = sinistro[padre[padre[x]]] THEN y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] ELSE IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) ELSE {come il THEN ma con destro e sinistro scambiati} colore[root[T]] = NERO

71 Inserimento in alberi Red-Black RB-Inserisci(T,x : albero-RB) ABR-Inserisci ( T,x ) colore[x] = ROSSO WHILE (x root[T] AND colore[padre[x]] = ROSSO) DO IF padre[x] = sinistro[padre[padre[x]]] THEN y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] ELSE IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) ELSE {come il THEN ma con destro e sinistro scambiati} colore[root[T]] = NERO Caso I

72 Inserimento in alberi Red-Black RB-Inserisci(T,x : albero-RB) ABR-Inserisci ( T,x ) colore[x] = ROSSO WHILE (x root[T] AND colore[padre[x]] = ROSSO) DO IF padre[x] = sinistro[padre[padre[x]]] THEN y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] ELSE IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) ELSE {come il THEN ma con destro e sinistro scambiati} colore[root[T]] = NERO Caso I Casi II e III

73 Inserimento in alberi Red-Black RB-Inserisci(T,x : albero-RB) ABR-Inserisci ( T,x ) colore[x] = ROSSO WHILE (x root[T] AND colore[padre[x]] = ROSSO) DO IF padre[x] = sinistro[padre[padre[x]]] THEN y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] ELSE IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) ELSE {come il THEN ma con destro e sinistro scambiati} colore[root[T]] = NERO Caso I Caso II Caso III

74 Inserimento in alberi Red-Black: I Nil 16 T x Il padre è NERO, il nuovo nodo x diventa ROSSO Nil

75 Inserimento in alberi Red-Black: I Nil 16 T x Il padre è NERO, il nuovo nodo x diventa ROSSO Nessun Cambiamento Non cambia laltezza nera di nessun nodo! Nil

76 Inserimento in alberi Red-Black: II Nil T Se il padre è ROSSO, il nuovo nodo è ROSSO 42 x 16 Nil

77 Inserimento in alberi Red-Black: II Nil T Se il padre è ROSSO, il nuovo nodo è ROSSO Nil 42 x Vincolo 3 è violato Caso I: Laltro figlio del padre del padre di x è rosso Nil

78 Inserimento in alberi Red-Black: II Nil T Se il padre è ROSSO, il nuovo nodo è ROSSO Nil 42 x Nil Caso I: Laltro figlio del padre del padre di x è rosso Coloriamo di nero il padre di x

79 Inserimento in alberi Red-Black: II Nil T Se il padre è ROSSO, il nuovo nodo è ROSSO Nil 42 x Nil Caso I: Laltro figlio del padre del padre di x è rosso Coloriamo di nero padre di x Coloriamo di nero il figlio del padre del padre di x

80 Inserimento in alberi Red-Black: II Nil T Se il padre è ROSSO, il nuovo nodo è ROSSO Nil 42 x Nil Caso I: Laltro figlio del padre del padre di x è rosso Coloriamo di nero padre di x Coloriamo di nero il figlio del padre del padre di x Coloriamo di rosso il padre del padre di x

81 Inserimento in alberi Red-Black: II Nil T Se il padre è ROSSO, il nuovo nodo è ROSSO Nil 42 x Nil Vincolo 3 è ripristinato Vincolo 4 è ripristinato Caso I: Laltro figlio del padre del padre di x è rosso Il padre del padre di x è il nuovo x

82 Inserimento in alberi Red-Black: II Nil T Se il padre è ROSSO, il nuovo nodo è ROSSO Nil 42 x Caso III: Laltro figlio del padre del padre di x è nero Nil Vincolo 3 è nuovamente violato tra il nuovo x e suo padre

83 Inserimento in alberi Red-Black: II Nil T Se il padre è ROSSO, il nuovo nodo è ROSSO Nil 42 x Nil Coloriamo di nero il padre di x Caso III: Laltro figlio del padre del padre di x è nero

84 Inserimento in alberi Red-Black: II Nil T Se il padre è ROSSO, il nuovo nodo è ROSSO Nil 42 x Nil Caso III: Laltro figlio del padre del padre di x è nero Coloriamo di nero il padre di x Coloriamo di rosso padre del padre di x

85 Inserimento in alberi Red-Black: II Nil T Se il padre è ROSSO, il nuovo nodo è ROSSO Nil 42 x Nil Caso III: Laltro figlio del padre del padre di x è nero Coloriamo di nero il padre di x Coloriamo di rosso padre del padre di x Rorazione sinistra

86 Inserimento in alberi Red-Black: II Nil T Se il padre è ROSSO, il nuovo nodo è ROSSO Nil 42 x Nil Poiché il padre di x sarà sempre nero, abbiamo finito Vincolo 3 è ripristinato Vincolo 4 è ripristinato

87 Inserimento in alberi Red-Black: II Nil T 42 x Nil Lunico caso un cui si procede a ripristinare verso lalto è il caso I. Negli altri 2 casi, il padre di x sarà sempre nero, si esce quindi dal WHILE e si termina

88 Cancellazione in RB Lalgoritmo di cancellazione per alberi RB è costruito sullalgoritmo di cancellazione per alberi binari di ricerca Useremo una variante con delle sentinelle Nil[T], una per ogni nodo NIL (perché?), per semplificare lalgoritmo Dopo la cancellazione si deve decidere se è necessario ribilanciare o meno Le operazioni di ripristino del bilanciamento sono necessarie solo quando il nodo cancellato è nero! (perché?)

89 Cancellazione in RB RB-Cancella(T,z:albero-RB) IF (sinistro[z] = Nil[T] OR destro[z] = Nil[T]) THEN y = z ELSE y = ARB-Successore(z) IF sinistro[y] Nil[T] THEN x = sinistro[y] ELSE x = destro[y] IF x Nil[T] THEN padre[x]=padre[y] IF padre[y] = Nil[T] THEN Root[T] = x ELSE IF y = sinistro[padre[y]] THEN sinistro[padre[y]]=x ELSE destro[padre[y]]=x IF y z THEN copia i campi di y in z IF colore[y ] = NERO THEN RB-Fix-Cancella(T,x) return y

90 Cancellazione in RB RB-Cancella(T,z:albero-RB) IF (sinistro[z] = Nil[T] OR destro[z] = Nil[T]) THEN y = z ELSE y = ARB-Successore(z) IF sinistro[y] Nil[T] THEN x = sinistro[y] ELSE x = destro[y] IF x Nil[T] THEN padre[x]=padre[y] IF padre[y] = Nil[T] THEN Root[T] = x ELSE IF y = sinistro[padre[y]] THEN sinistro[padre[y]]=x ELSE destro[padre[y]]=x IF y z THEN copia i campi di y in z IF colore[y ] = NERO THEN RB-Fix-Cancella(T,x) return y caso III casi I e II y è il nodo da eli- minare e x è il suo sostituto y è sostituito da x

91 Cancellazione in RB Dobbiamo ribilanciare se il nodo cancellato è nero (perché è cambiata laltezza nera) Possiamo immaginare di colorare di nero il nodo x che sostituisce il nodo cancellato y In tal modo la cancellazione non viola più il vincolo 4... … ma potrebbe violare il vincolo 1 (perché?) Lalgoritmo RB-Fix-Cancella(T,x) tenta di ripristinare il vincolo 1 con rotazioni e cambia- menti di colore: ci sono 4 casi possibili (e 4 simmetrici)

92 Cancellazione in RB B A D C x w E Il nodo x (cioè A nellesempio) è bordato di rosso ad indicare che è il nodo con un nero in più da aggiungere (e ridistribuire) nellalbero Caso 1: fratello rosso, padre nero

93 Cancellazione in RB B A D C x w E Caso 1: fratello rosso, padre nero B A D C x w E c Caso 2 Il nodo c (cioè B nellesempio) può essere sia rosso che nero! : fratello nero con figli neri

94 Cancellazione in RB B A D C x w E Caso 1 B A D C x w E c Caso 2 B A D C x w E c Caso 3 : fratello nero con figlio sin. rosso : fratello nero con figli neri B A D C x w E c c Caso 4 : fratello nero con figlio des. rosso : fratello rosso, padre nero

95 Cancellazione in RB: caso 1 B A D C x w A x D B E caso 1 E C w colore[padre[x]] = ROSSO colore[w] = NERO rotazione-destra(T,padre[x]) w = destro[padre[x]] Il fratello w di x è rosso w deve avere figli neri cambiamo i colori di w e del padre di x e li ruotiamo tra loro Non violiamo né il vincolo 3 né il 4 e ci riduciamo ad uno degli altri casi

96 Cancellazione in RB: caso 2 B A D C x w caso 2 E B A D C x E c c colore[w] = ROSSO x = padre[x] Il fratello w di x è nero w ha in questo caso entrambi i figli neri cambiamo il colore di w e il nuovo x diventa il padre Spostiamo il nero in più da x al nuovo x (il padre) e togliamo il nero da w per rispettare vincolo 4 WHILE ripristina se è il caso (se il padre era nero) il bilanciamento, altrimenti si termina. Se si arriva dal caso 1, B è sicuramente rosso, quindi dopo il caso 2 non cè più bisogno di ribilanciare, perché ora B ha un solo nero (il nero in più) e può essere semplicemente colorato di nero.

97 Cancellazione in RB: caso 3 B A D C x w caso 3 E B A D C x E c c w colore[sinistro[w]] = NERO colore[w] = ROSSO rotazione-sinistra(T,w) w = destro[padre[x]] Il fratello w di x è nero w ha in questo caso solo il figlo sinistro rosso cambiamo il colore del sinistro di w e cambiamo quello di w ruotiamo w col suo figlio sinistro Non violiamo alcun vincolo (3 e 4) e il nuovo fratello si x è ora nero con figlio sinistro nero, quindi ci portiamo nel caso 4

98 Cancellazione in RB: caso 4 B A D C x w caso 4 E c D E B C x = root[T ] A c cc colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[destro[w]] = NERO rotazione-destra(T,padre[x]) x = root[T] Il fratello w di x è nero w ha in questo caso solo il figlo destro rosso cambiamo i colori opportunamente e con una rotazione del padre di x con w si elimina il nero in più su x Non violiamo alcun vincolo (3 e 4) e abbiamo finito!

99 Cancellazione in RB: casi Abbiamo visto i 4 casi possibili quando il nodo x che sostituisce y (cancellato) è un figlio sinistro Esistono anche i 4 casi simmetrici (con destro e sinistro scembiati) quando x è figlio destro Esercizio: Illustrare i 4 casi simmetrici e scrivere lo pseudo-codice che li gestisce

100 Cancellazione in RB: algoritmo Fix RB-Fix-Cancella(T,x : albero-RB) WHILE x root[T] AND colore[x] = NERO DO IF x = sinistro[padre[x]] THEN w = destro[padre[x]] IF colore[w] = ROSSO THEN colore[padre[x]] = ROSSO colore[w] = NERO rotazione-destra(T,padre[x]) w = destro[padre[x]] ELSE IF (colore[sinistro[w]] = NERO AND colore[destro[w]] = NERO) THEN colore[w] = ROSSO x = padre[x] ELSE IF colore[destro[w]] = NERO THEN colore[sinistro[w]] = NERO colore[w] = ROSSO rotazione-sinistra(T,w) w = destro[padre[x]] colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[destro[w]] = NERO rotazione-destra(T,padre[x]) x = root[T] ELSE {come il THEN ma con destro e sinistro scambiati} colore[x] = NERO

101 Cancellazione in RB: algoritmo Fix RB-Fix-Cancella(T,x : albero-RB) WHILE x root[T] AND colore[x] = NERO DO IF x = sinistro[padre[x]] THEN w = destro[padre[x]] IF colore[w] = ROSSO THEN colore[padre[x]] = ROSSO colore[w] = NERO rotazione-destra(T,padre[x]) w = destro[padre[x]] ELSE IF (colore[sinistro[w]] = NERO AND colore[destro[w]] = NERO) THEN colore[w] = ROSSO x = padre[x] ELSE IF colore[destro[w]] = NERO THEN colore[sinistro[w]] = NERO colore[w] = ROSSO rotazione-sinistra(T,w) w = destro[padre[x]] colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[destro[w]] = NERO rotazione-destra(T,padre[x]) x = root[T] ELSE {come il THEN ma con destro e sinistro scambiati} colore[x] = NERO caso I caso II caso III caso IV

102 Cancellazoine in RB: esempio Nil T 42 Nil z

103 Cancellazoine in RB: esempio Nil T 42 Nil x 40 Nil y Il colore di x è rosso non si esegue il WHILE e si colora x di nero

104 Cancellazoine in RB: esempio Nil T 42 Nil x 40 Nil y Fatto! Il colore di x è rosso non si esegue il WHILE e si colora x di nero

105 Cancellazoine in RB: esempio II Nil T 42 Nil z

106 Cancellazoine in RB: esempio II Nil T 42 Nil x y Caso II simmetrico w colore[w] = ROSSO x = padre[x] 50

107 Cancellazoine in RB: esempio II Nil T 42 Nil x y Caso II simmetrico w colore[w] = ROSSO x = padre[x]

108 Cancellazoine in RB: esempio II Nil T 42 Nil x y w Il colore di x è ora rosso si esce dal WHILE e si colora x di nero 50

109 Cancellazoine in RB: esempio II Nil T 42 Nil x y Fatto! w Il colore di x è ora rosso si esce dal WHILE e si colora x di nero 50

110 Cancellazoine in RB: esempio III T Nil z

111 Cancellazoine in RB: esempio III T Nil y x

112 Cancellazoine in RB: esempio III T Nil x Caso II simmetrico w 85 y colore[w] = ROSSO x = padre[x]

113 Cancellazoine in RB: esempio III T Nil x Caso II simmetrico w 85 y colore[w] = ROSSO x = padre[x]

114 Cancellazoine in RB: esempio III T Nil x Caso II simmetrico 85 y colore[w] = ROSSO x = padre[x]

115 colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] Cancellazoine in RB: esempio III T Nil x Caso IV simmetrico w 85 y

116 colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] Cancellazoine in RB: esempio III T Nil x Caso IV simmetrico w 85 y

117 colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] Cancellazoine in RB: esempio III T Nil x Caso IV simmetrico w 85 y

118 colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] Cancellazoine in RB: esempio III T Nil x Caso IV simmetrico w 85 y

119 colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] Cancellazoine in RB: esempio III T Nil x Caso IV simmetrico w 85 y

120 colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] Cancellazoine in RB: esempio III T Nil x w 85 y Caso IV simmetrico

121 colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] Cancellazoine in RB: esempio III T Nil x 85 y Fatto! w

122 Cancellazoine in RB Loperazione di cancellazione è concettual- mente complicata! Ma efficiente: il caso 4 è risolutivo e applica 1 sola rotazione il caso 3 applica una rotazione e passa nel caso 4 il caso 2 non fa rotazioni e passa in uno qualsiasi dei casi ma salendo lungo il percorso di cancellazione il caso 1 fa una rotazione e passa in uno degli altri casi (ma se va nel caso 2, il caso 2 termina) Quindi al massimo vengono eseguite 3 rotazioni


Scaricare ppt "Algoritmi e Strutture Dati Alberi Bilanciati: Alberi Red-Black."

Presentazioni simili


Annunci Google