2. Riferimenti
•
•
2
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
Prof. Pier Luca Lanzi
3. Alberi Binari di Ricerca
•
•
•
4
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)
Prof. Pier Luca Lanzi
4. Alberi di Ricerca Bilanciati
•
•
•
5
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
Prof. Pier Luca Lanzi
5. Cosa Significa Bilanciato?
•
•
6
Fattore di bilanciamento
Il fattore di bilanciamento β(v) di un nodo v è la
massima differenza di altezza fra i sottoalberi di v
Esempio
Un albero perfettamente bilanciato ha β(v)=0
per ogni nodo v
Prof. Pier Luca Lanzi
6. 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)
Prof. Pier Luca Lanzi
7
7. Alberi Red-Black
(Red-Black Trees, RB-Tree)
•
•
•
8
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 neri
Ogni 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)
Prof. Pier Luca Lanzi
9. Alberi Rosso-Nero
(Red-Black Trees, RB-Tree)
•
10
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
Prof. Pier Luca Lanzi
10. Esempio di Albero Red-Black
11
7
3
NIL
18
NIL
10
8
22
11
NIL NIL NIL NIL
Prof. Pier Luca Lanzi
h=4
NIL
26
NIL
L7.11
NIL
11. Esempio di Albero Red-Black
12
7
3
NIL
18
NIL
10
8
22
11
NIL
NIL NIL NIL NIL
26
NIL
1. Ogni nodo è colorato di rosso o di nero
Prof. Pier Luca Lanzi
L7.12
NIL
12. Esempio di Albero Red-Black
13
7
3
NIL
18
NIL
10
8
22
11
NIL NIL NIL NIL
NIL
26
NIL
2. La radice e i nodi nil sono neri
Prof. Pier Luca Lanzi
L7.13
NIL
13. Esempio di Albero Red-Black
14
7
3
NIL
18
NIL
10
8
22
11
NIL NIL NIL NIL
NIL
26
NIL
3. Se un nodo è rosso, allora entrambi i suoi figli
sono neri. Se un nodo è rosso, allora il nodo
parente è nero
Prof. Pier Luca Lanzi
NIL
14. Esempio di Albero Red-Black
7
bh = 2
3
NIL
15
18 bh = 2
NIL
bh = 1 10
bh = 1 8
22
11
bh = 0 NIL NIL NIL NIL
NIL
26
NIL
NIL
4. Ogni percorso da un nodo interno ad una foglia
ha lo stesso numero di nodi neri
Prof. Pier Luca Lanzi
L7.15
15. Altezza di Albero Red-Black
•
•
16
Teorema
Un albero red-black con n chiavi ha un’altezza h,
h ≤ 2 lg(n + 1).
Corollario
Le 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
Prof. Pier Luca Lanzi
16. Alberi Red-Black
Le operazioni di INSERT e DELETE
modificano 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
Prof. Pier Luca Lanzi
18. Alberi Red-Black: Inserimento
•
•
19
Qual è l’idea?
Inserire x nell’albero. Colorare il nodo x rosso.
Solo la proprietà 3 potrebbe essere violata
Muovere la violazione verso l’alto ricolorando fino a
quando è aggiustata attraverso rotazioni e ricolorazioni
7
Esempio:
Inserire 15
3
18
10
8
Prof. Pier Luca Lanzi
22
11
26
19. Alberi red-black: Inserimento
•
•
20
Qual è l’idea?
Inserire x nell’albero. Colorare il nodo x rosso.
Solo la proprietà 3 potrebbe essere violata
Muovere la violazione verso l’alto ricolorando fino a
quando è aggiustata attraverso rotazioni e ricolorazioni
7
Esempio:
Inserire 15
Ricolorare
3
18
10
muovendo su
la violazione
8
22
11
26
15
Prof. Pier Luca Lanzi
20. Alberi red-black: Inserimento
•
•
21
Qual è l’idea?
Inserire x nell’albero. Colorare il nodo x rosso.
Solo la proprietà 3 potrebbe essere violata
Muovere la violazione verso l’alto ricolorando fino a
quando è aggiustata attraverso rotazioni e ricolorazioni
7
Esempio:
Inserire 15
Ricolorare
3
18
10
muovendo su
la violazione
8
22
11
26
15
Prof. Pier Luca Lanzi
21. Alberi red-black: Inserimento
•
•
22
Qual è l’idea?
Inserire x nell’albero. Colorare il nodo x rosso.
Solo la proprietà 3 potrebbe essere violata
Muovere la violazione verso l’alto ricolorando fino a
quando è aggiustata attraverso rotazioni e ricolorazioni
7
Esempio:
Inserire 15
Ricolorare
3
18
10
muovendo su
la violazione
Rotate(18)
8
22
11
26
15
Prof. Pier Luca Lanzi
22. Alberi red-black: Inserimento
•
•
23
Qual è l’idea?
Inserire x nell’albero. Colorare il nodo x rosso.
Solo la proprietà 3 potrebbe essere violata
Muovere la violazione verso l’alto ricolorando fino a
quando è aggiustata attraverso rotazioni e ricolorazioni
7
Esempio:
Inserire 15
Ricolorare
3
10
8
muovendo su
la violazione
Rotate(18)
18
11
15
Prof. Pier Luca Lanzi
22
26
23. Alberi red-black: Inserimento
•
•
24
Qual è l’idea?
Inserire x nell’albero. Colorare il nodo x rosso.
Solo la proprietà 3 potrebbe essere violata
Muovere la violazione verso l’alto ricolorando fino a
quando è aggiustata attraverso rotazioni e ricolorazioni
7
Esempio:
Inserire 15
Ricolorare
3
muovendo su
la violazione
Rotate(18)
Left-Rotate(7) e
ricolorare
Prof. Pier Luca Lanzi
10
8
18
11
15
22
26
24. Alberi red-black: Inserimento
•
•
25
Qual è l’idea?
Inserire x nell’albero. Colorare il nodo x rosso.
Solo la proprietà 3 potrebbe essere violata
Muovere la violazione verso l’alto ricolorando fino a
quando è aggiustata attraverso rotazioni e ricolorazioni
Esempio:
10
Inserire 15
18
7
Ricolorare
muovendo su
11
22
3
8
la violazione
15
26
Rotate(18)
Left-Rotate(7) e
ricolorare
Prof. Pier Luca Lanzi
25. Pseudo-Codice
26
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
Prof. Pier Luca Lanzi
26. Notazione Grafica
27
denota un sottoalbero con una radice nera
Tutti i
hanno la stessa altezza nera
Prof. Pier Luca Lanzi
27. Inserimento: Caso 1
28
Ricolora
C
A
C
D
y
x B
new x
D
A
B
oppure con i figli di A
scambiati
Prof. Pier Luca Lanzi
Spinge il nero di C su A e D, e
continua ricorsivamente, dato
che I parenti di C potrebbero
essere rossi
30. Analisi
•
31
Sommario dell’algoritmo di inserimento
Inserisce l’elemento e lo colora di rosso
Risalisce l’albero applicando il caso 1, che ricolora i
nodi
Se 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)
Prof. Pier Luca Lanzi
31. Sommario
•
•
•
•
32
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)
Prof. Pier Luca Lanzi
32. Alberi Red-Black e Mappe C++
•
•
•
33
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
Prof. Pier Luca Lanzi
34. 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';
}
Prof. Pier Luca Lanzi
35
35. Iteratori delle map
36
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
Prof. Pier Luca Lanzi
36. Esempio: Iteratori
37
#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;
}
Prof. Pier Luca Lanzi