Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

36
Prof. Pier Luca Lanzi Alberi Red Black Algoritmi e Calcolo Parallelo

description

Slide del corso di Algoritmi e Calcolo Parallelo per il corso di laurea magistrale in Ingegneria Matematica 2012/2013 - Politecnico di Milano

Transcript of Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Page 1: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Alberi Red BlackAlgoritmi e Calcolo Parallelo

Page 2: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Riferimenti

• Bertossi Alan A., Montresor Alberto. “Algoritmi e strutture di dati” (seconda edizione), CittàStudi 2010

• Stanley B. Lippman, Barbara E. Moo, Josee Lajoie“C++ Primer”, 5th Edition Addison-Wesley

2

Page 3: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Alberi Binari di Ricerca

• Alberi Binari di Ricerca Struttura dati ispirata alla ricerca binaria Le chiavi dei nodi del sottoalbero

sinistro left[x] sono ≤ key[x] Le chiavi dei nodi del sottoalbero

destro right[x] sono ≥ key[x]

• Operazioni Ricerca, minimo, massimo, prev, next, inserimento, e

cancellazione

• Complessità Ricerca, inserimento, cancellazione sono O(h) per un albero

di altezza h Un albero binario di ricerca con n nodi generato in maniera

casuale ha un’altezza O(lg n)

4

Page 4: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

5Alberi di Ricerca Bilanciati

• Alberi di ricerca Permettono di trovare un elemento in tempo O(h) Nel caso peggiore, h = O(n)Ma se l'albero è bilanciato, h=O(log n)

• Sono alberi di ricerca per i quali un’altezza di O(lg n) è garantita quando sono implementate le funzioni di inserimento/cancellazione dinamica

• Esempi di alberi bilanciati Alberi AVL Alberi 2-3 Alberi 2-3-4 B-alberi Alberi Red-black

Page 5: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Cosa Significa Bilanciato?

• Fattore di bilanciamento Il fattore di bilanciamento β(v) di un nodo v è la

massima differenza di altezza fra i sottoalberi di v

• EsempioUn albero perfettamente bilanciato ha β(v)=0

per ogni nodo v

6

Page 6: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Algoritmi di Bilanciamento

• Alberi AVL (Adel'son-Vel'skii e Landis, 1962) β(v) ≤ 1 per ogni nodo v Bilanciamento ottenuto tramite rotazioni

• Alberi 2-3 (Hopcroft, 1983) β(v) = 0 per ogni nodo v Bilanciamento ottenuto tramite merge/split,

grado variabile

• B-Alberi (Bayer, McCreight, 1972) β(v) = 0 per ogni nodo v Specializzati per strutture in memoria secondaria

• Alberi Red-Black (Bayer, 1972)

7

Page 7: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

8Alberi Red-Black (Red-Black Trees, RB-Tree)

• Un albero rosso-nero è un albero binario di ricerca in cui:Ogni nodo è colorato di rosso o di nero Le chiavi vengono mantenute solo nei nodi interni dell’albero Le foglie sono costituite da nodi nil

• Un albero red-black deve soddisfare i seguenti vincoli: La radice è nera I nodi nil sono neri Se un nodo è rosso, allora entrambi i suoi figli sono neriOgni percorso da un nodo interno ad una foglia ha lo stesso

numero di nodi neri

• Ogni nodo mantiene: puntatore al genitore (parent); puntatori ai figli sinistro/destro (left, right); colore (color); chiave e dati (key, data)

Page 8: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

9

Page 9: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Alberi Rosso-Nero (Red-Black Trees, RB-Tree)

• Nodo nil nodo sentinella che evita di trattare diversamente i

puntatori ai nodi dai puntatori nil al posto di un puntatore nil, si usa un puntatore ad un

nodo nil ne esiste solo uno, per risparmiare memoria nodo con figli nil → foglia nell'ARB corrispondente

• Definizione Il numero di nodi neri lungo ogni percorso da un nodo v

(escluso) ad una foglia è detto altezza nera di v, indicato bh(v)

Ben definito perché tutti i percorsi hanno lo stesso numero di nodi (regola 4)

• Definizione L’altezza nera di un albero RB è l’altezza nera della sua

radice

10

Page 10: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca LanziL7.11

Esempio di Albero Red-Black

h = 4

88 1111

1010

1818

2626

2222

33

77

NIL NIL

NIL NIL NIL NIL

NIL

NIL NIL

11

Page 11: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca LanziL7.12

Esempio di Albero Red-Black

88 1111

1010

1818

2626

2222

33

77

NIL NIL

NIL NIL NIL NIL

NIL

NIL NIL

12

1. Ogni nodo è colorato di rosso o di nero

Page 12: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca LanziL7.13

Esempio di Albero Red-Black

88 1111

1010

1818

2626

2222

33

77

NIL NIL

NIL NIL NIL NIL

NIL

NIL NIL

13

2. La radice e i nodi nil sono neri

Page 13: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Esempio di Albero Red-Black

88 1111

1010

1818

2626

2222

33

77

NIL NIL

NIL NIL NIL NIL

NIL

NIL NIL

14

3. Se un nodo è rosso, allora entrambi i suoi figli sono neri. Se un nodo è rosso, allora il nodo parente è nero

Page 14: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca LanziL7.15

Esempio di Albero Red-Black

88 1111

1010

1818

2626

2222

33

77

NIL NIL

NIL NIL NIL NIL

NIL

NIL NIL

15

4. Ogni percorso da un nodo interno ad una foglia ha lo stesso numero di nodi neri

bh = 2

bh = 1

bh = 1

bh = 2

bh = 0

Page 15: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Altezza di Albero Red-Black

• TeoremaUn albero red-black con n chiavi ha un’altezza h,

h ≤ 2 lg(n + 1).

• CorollarioLe funzioni di SEARCH, MIN, MAX, SUCCESSOR,

and PREDECESSOR sono eseguite con un tempo che è O(lg n) per un albero red-black con n chiavi

16

Page 16: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Alberi Red-Black

Le operazioni di INSERT e DELETEmodificano in un albero red-black

È possibile che le condizioni di bilanciamento risultino violate

Se le proprietà red-black vengono violate si può, modificare i colori nella zona della violazione;ribilanciare l’albero con opportune rotazioni

Page 17: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Rotazioni

• Le rotazioni mantengono l’ordinamento inordine delle chiavi

a Î a, b Î b, c Î g a ≤ A ≤ b ≤ B ≤ c

• Una rotazione può essere eseguita in O(1)

AA

BB

aa bbgg

RIGHT-ROTATE(B)

BB

AA

ggbbaa

LEFT-ROTATE (A)

18

Page 18: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Alberi Red-Black: Inserimento

• Qual è l’idea? Inserire x nell’albero. Colorare il nodo x rosso. Solo la proprietà 3 potrebbe essere violataMuovere la violazione verso l’alto ricolorando

fino a quando è aggiustata attraverso rotazioni e ricolorazioni

• Esempio: Inserire 15

88

1010

1818

2626

2222

77

33

1111

19

Page 19: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Alberi red-black: Inserimento

• Qual è l’idea? Inserire x nell’albero. Colorare il nodo x rosso. Solo la proprietà 3 potrebbe essere violataMuovere la violazione verso l’alto ricolorando

fino a quando è aggiustata attraverso rotazioni e ricolorazioni

• Esempio: Inserire 15Ricolorare

muovendo sula violazione 88

1010

1818

2626

2222

77

33

1111

20

1515

Page 20: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Alberi red-black: Inserimento

• Qual è l’idea? Inserire x nell’albero. Colorare il nodo x rosso. Solo la proprietà 3 potrebbe essere violataMuovere la violazione verso l’alto ricolorando

fino a quando è aggiustata attraverso rotazioni e ricolorazioni

• Esempio: Inserire 15Ricolorare

muovendo sula violazione 88

1010

1818

2626

2222

77

33

1111

21

1515

Page 21: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Alberi red-black: Inserimento

• Qual è l’idea? Inserire x nell’albero. Colorare il nodo x rosso. Solo la proprietà 3 potrebbe essere violataMuovere la violazione verso l’alto ricolorando

fino a quando è aggiustata attraverso rotazioni e ricolorazioni

• Esempio: Inserire 15Ricolorare

muovendo sula violazione

Rotate(18)88

1010

1818

2626

2222

77

33

1111

22

1515

Page 22: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Alberi red-black: Inserimento

• Qual è l’idea? Inserire x nell’albero. Colorare il nodo x rosso. Solo la proprietà 3 potrebbe essere violataMuovere la violazione verso l’alto ricolorando

fino a quando è aggiustata attraverso rotazioni e ricolorazioni

• Esempio: Inserire 15Ricolorare

muovendo sula violazione

Rotate(18)

23

88

1111

1010

1818

2626

2222

77

1515

33

Page 23: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Alberi red-black: Inserimento

• Qual è l’idea? Inserire x nell’albero. Colorare il nodo x rosso. Solo la proprietà 3 potrebbe essere violataMuovere la violazione verso l’alto ricolorando

fino a quando è aggiustata attraverso rotazioni e ricolorazioni

• Esempio: Inserire 15Ricolorare

muovendo sula violazione

Rotate(18)Left-Rotate(7) e

ricolorare

24

88

1111

1010

1818

2626

2222

77

1515

33

Page 24: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Alberi red-black: Inserimento

• Qual è l’idea? Inserire x nell’albero. Colorare il nodo x rosso. Solo la proprietà 3 potrebbe essere violataMuovere la violazione verso l’alto ricolorando

fino a quando è aggiustata attraverso rotazioni e ricolorazioni

• Esempio: Inserire 15Ricolorare

muovendo sula violazione

Rotate(18)Left-Rotate(7) e

ricolorare

25

88 1111

1010

1818

2626

2222

77

1515

33

Page 25: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Pseudo-Codice

RB-INSERT(T, x)TREE-INSERT(T, x) color[x] ← RED only RB property 3 can be violated⊳ while x<>root[T] and color[p[x]] = RED do if p[x] = left[p[p[x]] then y ← right[p[p[x]] y = aunt/uncle of x⊳ if color[y] = RED then <Case 1> else if x = right[p[x]]

then <Case 2> Case 2 falls into Case 3⊳ <Case 3> else <“then” clause with “left” and “right” swapped>color[root[T]] ← BLACK

26

Page 26: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Notazione Grafica

denota un sottoalbero con una radice nera

Tutti i hanno la stessa altezza nera

27

Page 27: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Inserimento: Caso 1

BB

CC

DDAA

x

y

oppure con i figli di A scambiati

BB

CC

DDAA

new x

Spinge il nero di C su A e D, e continua ricorsivamente, dato che I parenti di C potrebbero essere rossi

Ricolora

28

Page 28: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Inserimento: Caso 2

L7.29

BB

CC

AA

x

y

Left-Rotate(A)

AA

CC

BB

x

y

Transforma nel Caso 3

29

Page 29: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca LanziL7.30

Inserimento: Caso 3

AA

CC

BB

x

y

Right-Rotate(C)

AA

BB

CC

Finito! Nessuna violazione delle proprietà RB

30

Page 30: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Analisi

• Sommario dell’algoritmo di inserimento Inserisce l’elemento e lo colora di rossoRisalisce l’albero applicando il caso 1, che

ricolora i nodiSe il caso 2 e 3 si verificano, applicare una o due

rotazioni

• Esecuzione: O(lg n) con rotazioni che sono O(1)

• Cancellazione: stessa complessità e stesso numero di rotazioni dell’inserimento (dal libro di testo)

31

Page 31: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

32Sommario

• Alberi di ricerca bilanciati Alberi di ricerca per i quali un’altezza di O(lg n) è

garantita quando sono implementate le funzioni di inserimento/cancellazione dinamica

• Un albero rosso-nero è un albero binario di ricerca in cui: Ogni nodo è colorato di rosso o di nero Le chiavi vengono mantenute solo nei nodi interni

dell’albero Le foglie sono costituite da nodi nil

• Un albero red-black deve soddisfare quattro vincoli: La radice è nera I nodi nil sono neri Se un nodo è rosso, allora entrambi i suoi figli sono neri Ogni percorso da un nodo interno ad una foglia ha lo

stesso numero di nodi neri

• Inserimento e cancellazione devono mantenere le proprietà RB, hanno complessità O(lg n)

Page 32: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Alberi Red-Black e Mappe C++

• Le STL del C++ non hanno implementazioni di alberi di ricerca

• Gli alberi red-black sono utilizzati nelle map e nelle multimap

• Le mappe sono container associativi che memorizzano delle combinazioni di chiave e valore mappato

33

Page 33: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

map C++

• Funzionioperator=

• Iteratoribegin(), end(), rbegin(), rend()

• Modificatoriclear, insert, erase, swap

• Ricercacount, find, lower_bound, upper_bound

34

Page 34: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Esempio: Conta la frequenza delle parole

#include <iostream>#include <string>#include <map> int main(){ std::map<std::string, int> wordcounts; std::string s; while (std::cin >> s && s != "end") ++wordcounts[s]; while (std::cin >> s && s != "end") std::cout << s << ' ' << wordcounts[s] << '\n';}

35

Page 35: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Iteratori delle map

std::map<std::string, int>::iterator it;

for(it=wordcounts.begin(); it!=wordcounts.end(); it++){

// cosa indica *it?}

• Le mappe memorizzano un tipo speciale chiamato “pair”

• Una mappa “map<std::string, int>” memorizza elementi di tipo pair<std::string,int>

• “pair” e’ raggruppa due elementi accessibili attraverso il campo first e il campo second

• Le funzioni di insert ed erase lavorano su oggetti di tipo pair

36

Page 36: Algoritmi e Calcolo Parallelo 2012/2013 - Alberi Red-Black

Prof. Pier Luca Lanzi

Esempio: Iteratori

#include <iostream>#include <string>#include <map>

int main(){ std::map<std::string, int> wordcounts; std::string s;

// legge tutte le parole dall'input fino a quando finisce l'input// o trova end

while (std::cin >> s) ++wordcounts[s];

std::map<std::string, int>::iterator it;

for(it=wordcounts.begin(); it!=wordcounts.end(); it++) std::cout << it->first << " => " << it->second << std::endl;}

37