Alberi autoaggiustanti Lezione n°7 Prof.ssa Rossella Petreschi Lezione del 3/11/2011 del Corso di Algoritmi e Strutture Dati Riferimenti: Capitolo 15 del testo Cormen, Leiserson, Rivest “Introduzione agli Algoritmi” Edizioni: Jackson Libri Paragraf 7.5 del testo Kingston “Algorithms and data structures” Edizioni: Addison-Wesley ASD 2011/2012
Analisi ammortizzata di un singolo passo di splay u fs di p(u) e r = p(u) i= ci+(Ti)-(Ti-1)= per (1,2) = 1+ri(u)+ri(p(u)) -ri-1(u)-ri-1(p(u)) = per (3) = 1+ri(u)+ri(p(u)) -ri-1(u)- ri(u) = = 1+ ri(p(u)) -ri-1(u)≤ ≤ 1+ri(u) -ri-1(u) ≤ ≤ 1 + 3[ri(u) - ri-1(u)] u,p(u) sono gli unici nodi che cambiano il valore di size prima e dopo l’operazione di splay; ci misura il numero di rotazioni; ri-1(p(u)) = ri(u) ASD 2011/2012 2
Analisi ammortizzata di un singolo passo di splay u fs di p(u) e p(u) fs di p(p(u)) i=ci+(Ti)-(Ti-1)= = 2+ri(u)+ri(p(u))+ri(p(p(u)))-ri-1(u)-ri-1(p(u))-ri-1(p(p(u)))= per (1,2) = 2+ri(p(u)) +ri(p(p(u)))-ri-1(u)-ri-1(p(u)) ≤ per (3) ≤ 2+ri(u) +ri(p(p(u)))-2ri-1(u)≤ per (4) ≤ [2+ri(u) +ri(p(p(u)))-2ri-1(u)] + [2 ri(u) - ri-1(u) - ri(p(p(u)))-2 ]=per (5) = 3[ri(u) - ri-1(u)] u,p(u),p(p(u)) sono gli unici nodi che cambiano il valore di size prima e dopo l’operazione di splay; ci misura il numero di rotazioni; sizei(u)= sizei-1(p(p(u))); ri-1(p(u)) ≥ ri-1(u); ri(p(u)) ≤ ri(u); 2 ri(u) - ri-1(u) - ri(p(p(u)))-2 ≥ 0 (in modo analogo u fs di p(u) e p(u) fd di p(p(u)) ) ASD 2011/2012 3
Analisi ammortizzata di un singolo passo di splay 2 ri(u) - ri-1(u) - ri(p(p(u)))-2 ≥ 0 Per = sizei-1(u) / sizei(u) > 0; = sizei(p(p(u))) / sizei(u) >0; si ha +≤ 1 e quindi, per il lemma, log + log ≤ -2 Allora: log (sizei-1(u) / sizei(u)) + log (sizei(p(p(u))) / sizei(u)) ≤ -2 ri-1(u) + ri(p(p(u))) - 2ri(u) ≤ -2 ovvero 2ri(u) - ri-1(u) - ri(p(p(u))) - 2 ≥ 0 Lemma Datiereali positivi con +≤ 1, vale log + log ≤ -2 Prova: log + log = log la funzione logaritmo è monotona crescente e raggiunge il massimo, nell’intervallo dell’ipotesi, quando è massimo ovvero quando ovvero log + log = -2 ASD 2011/2012 4
Complessità ammortizzata totale Il tempo ammortizzato di una singola operazione di splay è pari a (logm), con m numero dei nodi dell’albero in cui si effettua l’operazione, dato che: i ≤ 1 + 3 (ri(u) - ri-1(u)) = , per i= 1,…k 1 + 3 (rangofinale(u) - riniziale(u)) , rangofinale(u) ≤ log m Il tempo totale ammortizzato di una sequenza di operazioni (di ricerca, di inserimento e di cancellazione) su uno splay-tree è data da ( logn), con n massimo numero di nodi che l’albero raggiunge durante la serie di operazioni. ASD 2011/2012 5
Tabella di comparazione struttura ricerca inserisci cancella Min/max ordina vettore O(n) O(1) O(n)+O(n) O(n)/O(n) O(nlogn) lista vet.ord. O(logn) O(logn)+O(n) O1/O(1) O1 lista ord. O(logn)+O(1) O(logn)+ O(1) O(1)/O(1) O1) Heap O(n)+ O(logn) O(1)/O(n)+ Heap Fib* AR O(h)≤O(n) O(h)≤O(n)/ ARlog Arlog* O(logn)/O(logn) ASD 2011/2012 6
Applicazioni Gli splay tree sono molto utili per l'implementazione di cache dove gli algoritmi di gestione dei dati sono legati a due concetti fondamentali: località del codice: non si accede alle informazioni in modo uniforme (accesso casuale), ma ci sono parti di informazione a cui si accede più frequentementente (accesso localizzato). eliminazione dalla cache dei dati usati meno recentemente. Ad ogni accesso l'algoritmo splay sposta il nodo su cui opera alla radice,conseguentemente gli elementi a cui si accede più frequentemente si trovano sempre vicino alla radice dell'albero, rendendoli più velocemente accessibili e migliorando sensibilmente i tempi di accesso globali alla cache nelle operazioni di ricerca e cancellazione. Esistono più implementazioni e migliori librerie per gli alberi bilanciati poiché, dato che il collo di bottiglia della cache è l'accesso al disco (più lento di tre ordini di grandezza) e non le operazioni sulla struttura dati, praticamente si preferisce migliorare e sfruttare quello che già si ha. Il kernel del sistema operativo linux fino alla versione 2.2 usava gli alberi AVL, poi sono stati implementati gli alberi Red/Black. ASD 2011/2012 7
Estensione di una struttura dati scelta della struttura dati di base; determinazione dell’informazione aggiuntiva e verifica che la stessa possa essere mantenuta attraverso le usuali operazioni di modifica della struttura dati scelta; sviluppo delle nuove operazioni. ASD 2011/2012 8
Teorema di estensione su un AR bilanciato Sia a il campo aggiuntivo che estende un AR bilanciato di n nodi. Si supponga che il valore a, per ogni nodo x, possa essere calcolato in tempo costante usando solo le info di x, fs(x) e fd(x). a può essere mantenuta su tutto AR, per ogni sequenza di operazioni senza modificare il tempo O(logn). ASD 2011/2012 9
Intervalli Un intervallo i è una coppia ordinata di numeri reali con estremo sinistro, es(i)=t1 ed estremo destro ed(i)=t2 Intervallo chiuso: t1≤ t ≤ t2 e t in R Qualsiasi coppia di intervalli i,i’soddisfa la proprietà di tricotomia degli intervalli: o i ed i’ si sovrappongono; o ed(i) < es(i’) o ed(i’) < es(i) ASD 2011/2012 10
Alberi di intervalli Un albero di intervalli,AI, è un albero bilanciato dove ciascun nodo i memorizza un intervallo i rappresentato come coppia ordinata (es(i), ed(i)). Su un AI si esegue: inserisci un intervallo; elimina un intervallo; ricerca, se esiste, un intervallo i nell’albero che si sovrapponga ad un dato intervallo x L’inserimento nell’albero avviene analizzando l’estremo sinistro e la visita inorder fornisce gli intervalli ordinati rispetto all’estremo sinistro. ASD 2011/2012 11
Estensione di alberi bilanciati scelta della struttura dati di base: alberi bilanciati (o AVL o red/black) dove ciascun nodo i memorizza un intervallo i , [es(i), ed(i)]; determinazione dell’informazione aggiuntiva e verifica che la stessa possa essere mantenuta attraverso le usuali operazioni di modifica della struttura dati scelta: max[i]: il più grande degli estremi destri degli intervalli memorizzati nel sottoalbero radicato in i; max[i]= max[max[fs(i)], max[fd(i)], ed[i]]; sviluppo delle nuove operazioni: ricerca (AR,x): a partire dalla radice e, al limite fino ad una foglia, confronta se x si sovrappone all’ intervallo corrente. Se nessun confronto ha dato risultato positivo anche dopo l’analisi della foglia, l’output sarà non trovato. ASD 2011/2012 12
Ricerca(AR,x) Ricerca(AR,x) i = radice Fintantoche inil e x non si sovrappone a int[i] ripeti se fs(i) nil e max[fs(i)] ≥ es(x) allora i = fs(i) oppure i = fd(i) ritorna i ASD 2011/2012 13
Correttezza di Ricerca(AR,x) La procedura Ricerca(AR,x) lavora correttamente. Prova Bisogna garantire che se i non esiste in c, cammino (fs/fd) scelto dopo un confronto, allora i non può appartenere al cammino non scelto. Se dopo il confronto la ricerca procede a dx e fs(i) nil, ovvero max (fs(i)) < es(x),allora per ogni i’ nel sottoalbero sinistro di i vale ed(i’) ≤ max (fs(i)) < es(x) e quindi, per la tricotomia, i’ ed x non possono intersecarsi. la ricerca procede a sx, ovvero max (fs(i)) ≥ es(x). Nel sottoalbero sinistro di i almeno un i’tale che ed(i’) = max (fs(i)) ≥ es(x). Per hip. i’ ed x non si sovrappongono e quindi per la tricotomia ed(x) < es(i’). Per la struttura di AR si ha ed(x) < es(i’) ≤ es(i’’), per ogni i’’ nel sottoalbero destro di i . ASD 2011/2012 14