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