Laboratorio di Algoritmi e Strutture Dati II Semestre 2005

Laboratorio di Algoritmi e Strutture Dati
II Semestre 2005/2006
Alberi di Ricerca Bilanciati
Marco Antoniotti
Riassunto sui dizionari
•
•
Dizionario: astrazione di collezioni <chiave, valore>
Operazioni fondamentali
– Insert
– Search
– Delete
•
BSTs randomizzati esplicitamente
– O(lg(N)) tempo per operazione
• A meno di non essere estremamente (e ridicolmente) sfortunati
– Si memorizza la dimensione del sottoalbero radicato in ogni nodo
– Si generano dei numeri casuali ad ogni operazione di inserimento
•
Alberi bilanciati esplicitamente
– 2-3-4 Trees
– Red-Black trees
– B-trees (cenni)
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
1/23
1
Alberi 2-3-4
•
•
Uno schema per mantenere l’albero bilanciato durante inserimenti e
rimozioni
Si può generalizzare a chiavi multiple
•
Ogni nodo interno (più la radice) può avere 2, 3, o 4 “figli”
– 2-nodo: una chiave, due figli
– 3-nodo: due chiavi, tre figli
– 4-nodo: tre chiavi, quattro figli
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
2/23
Alberi 2-3-4: inserimento e ricerca
• Search
– Confronta la chiave da ricercare con le chiavi nel nodo
– Trova l’intervallo che contiene la chiave di ricerca
– Segui il link associato e ricorri
• Inserimento
– Cerca la chiave da inserire fino in fondo (si assumono chiavi
distinte) e trova il nodo dove va inserita
– Se la chiave va inserita in un
• 2-nodo: trasformalo in un 3- nodo
• 3-nodo: trasformalo in un 4-nodo
• 4-nodo: ????
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
3/23
2
Divisione (split) di un 4-nodo durante
la ricerca
• Idea: si trasforma l’albero mentre si discende
– Si assicura che il nodo finale (in cui bisogna inserire la chiave) non
sia un 4-nodo
– Per dividere un 4-nodo si usano solo operazioni locali
• Invariante:
– Una delle operazioni qui sopra va applicata al “prossimo” nodo
– L’inserimento alla “foglia” è semplice, perchè il nodo è un 2- od un
3-nodo
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
4/23
Divisione di un 4-nodo
Si muove la chiave di mezzo in su
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
5/23
3
Crescita di un albero 2-3-4
L’albero cresce dal basso verso l’alto
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
6/23
Bilanciamento in un albero 2-3-4
•
Proprietà: tutti i cammini dalla radice ad una foglia hanno la stessa
altezza
•
Altezza dell’albero
–
–
–
–
•
Caso peggiore: tutti 2-nodi, lg(N)
Caso migliore: tutti 4-nodi, log4(N) = 1/2 lg(N)
Tra 10 e 20 per un milione di nodi
Tra 15 e 30 per un miliardo di nodi
Nota: le analisi di complessità per i 2-3-4 nodi non tengono conto dei
confronti intra-nodo
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
7/23
4
Alberi 2-3-4: implementazione?
•
L’implementazione diretta degli alberi 2-3-4 è piuttosto complicata a
causa della casistica da tener presente durante le operazioni
– Tre tipi di nodi
– Come implementiamo getChild?
– Casistica per l’operazione split
// Nota: il codice seguente va considerato come
// pseudo-codice.
Node234* insert(Node234* h, Key k, Value v) {
Node234* x = h; Node234* p;
while (x != null) {
p = x; x = x->getChild(k);
if (x->is4Node()) x->split();
}
// Ora possiamo inserire
if (p->is2Node())
p->changeTo3Node(k, v);
else (p->is3Node()) p->changeTo4Node(k, v);
}
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
8/23
Alberi Red-Black
• Gli alberi 2-3-4 possono essere “interpretati” direttamente come
degli alberi binari particolari: gli alberi red-black
• Vantaggi
– Sono alberi binari bilanciati, quindi l’operazione di search è uguale
a quella dei BSTs
– Le trasformazioni che li mantengono bilanciati sono facilmente
interpretabili come operazioni su alberi 2-3-4
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
9/23
5
Alberi Red-Black
•
Rappresentazione di un albero 2-3-4 come un albero red-black
– Si usano degli archi interni colorati di rosso per rappresentare i 3- e 4-nodi
• Conseguenza?
•
Corrispondenza tra alberi 2-3-4 e alberi red-black
•
Non 1-1 perchè i 3-nodi possono essere rappresentati in due modi
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
10/23
Divisione di 4-nodi:
versione con alberi red-black
• Due casi semplici: si scambia semplicemnte il colore degli archi
• Due casi più complicati: si usano le rotazioni
Una rotazione
Due rotazioni
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
11/23
6
Inserimento in un albero red-black
• Esempio
Inserimento di G
Cambio colori
Rotazione a destra di R
Rotazione a sinistra di E
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
12/23
Costruzione di un albero red-black
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
13/23
7
Bilanciamento in un albero red-black
• Proprietà: la lunghezza del cammino più lungo dalla radice ad
una foglia è al più il doppio del cammino più corto
• Altezza dell’albero nel caso peggiore: 2 lg(N)
• Nota: tutti i confronti sono contati
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
14/23
Dizionari a confronto
Caso peggiore
Caso medio
Implementazione
Search
Insert
Delete
Search
Insert
Delete
Array ordinato
lg(N)
N
N
lg(N)
N/2
N/2
Lista non ordinata
N
N
N
N/2
N
N
Hash Table
N
1
N
1*
1*
1*
“Randomized”
BST
lg(N)**
lg(N)**
lg(N)**
lg(N)**
lg(N)**
lg(N)**
Red-Black BST
lg(N)
lg(N)
lg(N)
lg(N)
lg(N)
lg(N)
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
15/23
8
Alberi Red-Black in pratica
• Alberi Red-Black rispetto ad Hash Tables
– Il codice delle Hash Table è di solito più semplice e più veloce
• Si usa l’aritmentica invece del confronto
– Le prestazioni delle hash tables hanno in genere meno garanzie
– I BSTs (red black) sono più flessibili e permettono più facilmente
l’implementazione di operazioni extra
• Gli alberi Red-Black sono usati spesso come strutture dati di
libreria
– TreeMap e TreeSet in Java
– map, multimap e multiset nella STL C++
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
16/23
Esempio C++
•
•
La Standard Template Library (o perlomeno alcune sue
implementazioni) di C++ usa gli alberi milanisti per degli array
associativi chiamati map
Esempio
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main() {
map<string, string> st;
st["www.google.com"] = "66.249.85.104";
st["www.unimib.it"] = "149.132.2.194";
cout << st["www.google.com"] << endl
<< st["www.unimib.it"] << endl
<< st["foo"] << endl;
}
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
17/23
9
B-Trees
•
I B-trees generalizzano gli alberi 2-3-4 permettendo ad ogni nodo di avere fino
ad M figli
•
Applicazione principale: File Systems e/o Basi di Dati
–
–
–
–
•
Analisi costi/benefici
–
–
–
•
Leggere una “pagina” di un file system in memoria è un’operazione costosa
Una volta in memoria, accedere al contenuto di una pagina è praticamente gratis
Obiettivo: minimizzare il numero di pagine lette da FS
Dimensioni di un nodo pari alla dimensione di una “pagina” di file system (definita, di
solito, dal sistema operativo e/o dal (sotto)sistema di file system)
Se la dimensione M di una pagina è grande allora ci sono pochi livelli nell’albero
Se M è piccolo allora si spreca meno spazio
Typicamente M = 1000, N < 1012
Risultato: il numero di accessi ad una pagina è logM(N) per operazione
–
In pratica 3 o 4
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
18/23
Esempio di un B-tree
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
19/23
10
Esempio di un B-tree (cont)
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
20/23
Sommario delle prestazioni di
Dizionari
Caso peggiore
Caso medio
Implementazione
Search
Insert
Delete
Search
Insert
Delete
Array ordinato
lg(N)
N
N
lg(N)
N/2
N/2
Lista non ordinata
N
N
N
N/2
N
N
Hash Table
N
1
N
1*
1*
1*
“Randomized” BST
lg(N)**
lg(N)**
lg(N)**
lg(N)**
lg(N)**
lg(N)**
Red-Black BST
lg(N)
lg(N)
lg(N)
lg(N)
lg(N)
lg(N)
Splay
lg(N)
lg(N)
lg(N)
lg(N)
lg(N)
lg(N)
B-trees
1
1
1
1
1
1
Per i B-trees si intende il numero di accessi a pagine su FS
Non abbiamo visto gli Splay Trees
Vedremo le hash tables successivamente
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
21/23
11
I B-tree in Natura
• File systems
– Windows: HPFS
– Mac: HFS, HFS+
– Linux: ReiserFS, XFS, Ext3FS, JFS (journaling)
• Basi di Dati
– I B-trees sono il sistema più comune di indicizzazione per basi di
dati
– Oracle, DB2, Ingres, PostgresSQL, …
• Verificare MySQL !!!
• Varianti
–
–
–
–
B-trees: Bayer-McCreight, 1972
B+ trees: tutti i dati nei nodi esterni
B* trees: mantiene le pagine fino a che non sono piene a 2/3
R trees: variante multidimensionale usata per applicazioni spaziali
(GIS, VLSI etc etc)
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
22/23
Sommario
• Implementazioni di Dizionari con garanzia logaritmica sulle varie
operazioni
– Garanzia probabilistica: BST randomizzato esplicitamente
– Garanzia ammortizzata: Splay tree
– Garanzia deterministica: Red-Black trees
• Tutti gli algoritmi sono una variazione sul tema: rotazioni
durante l’inserimento
• L’astrazione si estende anche ad applicazioni per file di
grandissime dimensioni: B trees
II Semestre 2005/2006
Laboratorio Algoritmi - Marco Antoniotti
23/23
12