La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

B trees. Memoria Memoria principale Piccola e veloce (chips, silicio) Mb10 -8 / 10 -9 sec. Memoria secondaria Grande e lenta (dischi magnetici) Gb10 -3.

Presentazioni simili


Presentazione sul tema: "B trees. Memoria Memoria principale Piccola e veloce (chips, silicio) Mb10 -8 / 10 -9 sec. Memoria secondaria Grande e lenta (dischi magnetici) Gb10 -3."— Transcript della presentazione:

1 B trees

2 Memoria Memoria principale Piccola e veloce (chips, silicio) Mb10 -8 / sec. Memoria secondaria Grande e lenta (dischi magnetici) Gb10 -3 / sec.

3 Blocchi di memoria Memoria principale Un blocco contiene k bytes, k=1,..., 64 Memoria secondaria Un blocco contiene k Kb (kiloBytes = 1024 bytes) k=64,..., 1024

4 Problema Minimizzare il numero di accessi alla memoria secondaria Soluzione Strutture dati ad hoc, specifiche per questo problema.

5 Dischi magnetici Dallalto rotazione traccia settore testina di lettura/scrittura cilindri I dischi memorizzano molti dati ma sono lenti. Trovare una pagina richiede tempo (posizionamento testina più tempo di rotazione, 5- 10ms), la lettura è veloce Conviene leggere i dati in pagine (blocchi) di 2-16 Kb ciascuno.

6 Tempo di esecuzione Spesso il tempo necessario per accedere ad una pagina su disco è superiore al tempo necessario allelaboratore per esaminare tutta linformazione letta. Tempo di esecuzione: numero di accessi a disco tempo (di calcolo) della CPU Il num. di accessi a disco è misurato in numero di pagine lette/scritte. Non è costante, però...

7 Operazioni sui dati Per accedere alle strutture dati non si fa riferimento a indirizzi in memoria centrale ma a locazioni su file. Sia x è un puntatore ad un oggetto: se x è nella memoria principale, gli si accede ad es. con key[x] se è su disco, la procedura DiskRead(x) copia loggetto in memoria ( DiskWrite(x) lo ricopia su disco)

8 B-tree Un B-tree è un albero di radice root(T) in cui ogni nodo x è strutturato come segue: X= n[x] = numero delle chiavi (key) del nodo x leaf[x]: booleano, vero se x è foglia Chiavi memorizzate in ordine non-decrescente key 1 key 2 key 3... key n n leaf key 1 key 2...key n

9 B-tree If leaf[x]= false (x è un nodo interno) c 1 [x], c 2 [x],..., c n[x]+1 [x] sono puntatori ai nodi figli I campi key i [x] definiscono gli intervalli delle chiavi memorizzate in ciascun sottoalbero: se k i è una chiave memorizzata nel sottoalbero di radice c i [x] allora si ha che: k 1 key 1 [x] k 2 key 2 [x]... key n[x] [x] k n[x]+1 Ogni foglia ha la stessa profondità, che è quiandi anche laltezza dellalbero.

10 B-tree a i key 1 b i key 2 d i key 3 e i Il num. di chiavi memorizzabili in un nodo è limitato in funzione di un intero t, t 2, chiamato grado minimo x rootn[x] t-1n[x] 2t-1 x = rootn[x] 1 Un nodo x è pieno se n[x] = 2t-1 c 1 key 1 c 2 key 2 c 3 key 3 c 4 aiai bibi didi eiei

11 B-tree 1 nodo chiavi nodi chiavi nodi chiavi Più di un miliardo di chiavi! h=2 num. accessi 2 !!! root[T]

12 B-tree Alberi di ricerca bilanciati (balanced search tree, BST) I nodi dei B-tree possono avere molti figli (migliaia) Profondità = O(log n) Generalizzano naturalmente i BST M D,H Q,T,X B,CF,GJ,K,L N,P R,S V,W Y,Z

13 Altezza di un B-tree Se n 1, allora per ogni B-tree T (con n chiavi) di altezza h, di grado minimo t 2, vale che: h log t ((n+1)/2) 1 t - 1 … tt … t livello #di nodi

14 Analisi tempi di esecuzione numero di accessi a disco: O(log t n) CPU time: O(t log t n) trovato non trovato

15 Operazioni sui B-tree Assunzioni: La radice di un B-tree è sempre in memoria centrale Quando si modifica la root bisogna effettuare una scrittura su disco ( DiskWrite ) Qualsiasi nodo venga passato come parametro deve già essere in memoria centrale, a seguito di una Disk-Read.

16 Operazioni sui B-tree Le operazioni da realizzare sono: Ricerca di una chiave (semplice) Creazione di un nuovo albero vuoto (semplice) Inserimento di nuove chiavi (complessa) Cancellazione di chiavi (complessa)

17 B-tree search(x,k) B-Tree-Search(x,k) i=1 while i n[x] and k>key i [x] do i=i+1 if i n[x] and k=key i [x] then return(x,i) if (foglia[x]) then return(nil) elseDISK-READ(c i [x]) return(B-tree search(c i [x],k) Operazione di ricerca su B-tree, parametri: x: radice di un sottoalbero k: chiave da cercare

18 Creazione di un B-tree vuoto B-Tree-Create(T) x = AllocateNode() leaf[x]=true n[x]=0 DiskWrite(x) root[T]=x num accessi a pagina: O(1) tempo CPU: O(1) Inizialmente si crea un nodo radice vuoto con la B-Tree- Create, poi lo si riempie con la B-Tree-Insert. Entrambe utilizzano la Allocate-Node che crea un nuovo nodo e gli assegna una pagina di disco in tempo O(1).

19 Divisione di un nodo I nodi si riempiono e raggiungono la loro capacità massima di 2t – 1 chiavi. Per poter inserire una nuova chiave è necessario fare spazio, cioè dividere (split) il nodo. La divisione avviene in corrispondenza della sua chiave mediana. Risultato: una chiave di x sale di un livello + 2 nodi con t-1 chiavi.

20 Split di un nodo P Q R S T V W T1T1 T8T N W... y = c i [x] key i-1 [x] key i [x] x... N S W... key i-1 [x] key i [x] x key i+1 [x] P Q RT V W y = c i [x]z = c i+1 [x] Mediano! t=4, 2t-1=7 non pieno pieno

21 B-Tree-Split-Child B-Tree-Split-Child(x,i,y) z AllocateNode() leaf[z] leaf[y] n[z] t-1 for j 1 to t-1 key j [z] key j+t [y] if not leaf[y] then for j 1 to t c j [z] c j+t [y] n[y] t-1 for j n[x]+1 downto i+1 c j+1 [x] c j [x] c i+1 [x] z for j n[x] downto i key j+1 [x] key j [x] key i [x] key t [y] n[x] n[x]+1 DiskWrite(y) DiskWrite(z) DiskWrite(x) x: nodo padre y: nodo da spezzare (figlio di x) i: indice in x z: nuovo nodo P Q R S T V W T1T1 T8T N W... y = c i [x] key i-1 [x] key i [x] x

22 Split: tempo di CPU Lo split è unoperazione locale che non percorre lalbero Tempo di CPU (t): I due loop vengono eseguiti t volte 3 operazioni di I/O

23 Inserimento di elementi Inserimento effettuato ricorsivamente: si inizia dalla radice e si percorre ricorsivamente lalbero fino al livello delle foglie E necessario scendere ad un livello inferiore se il nodo corrente contiene 2t – 1 elementi

24 Inserimento di elementi (2) Caso particolare: la radice è piena (BtreeInsert) B-Tree-Insert(T) r root[T] if n[r] == 2t – 1 then s AllocateNode() root[T] s leaf[s] FALSE n[s] 0 c 1 [s] r B-Tree-Split-Child(s,1,r) B-Tree-Insert-Non-Full(s,k) else B-Tree-Insert-Non-Full(r,k)

25 Lo split della radice richiede la creazione di nuovi nodi Lalbero cresce (verso lalto invece che verso il basso). Split della radice A D F H L N P T1T1 T8T8... root[T] r A D FL N P H root[T] s r

26 Inserimento di elementi BInsertTreeNonFull cerca di inserire un elemento k in un nodo x, che si assume essere non pieno quando la procedura viene chiamata BTreeInsert e la ricorsione in BTreeInsertNonFull garantiscono che lassunzione sia vera.

27 Inserimento di elementi: Pseudo Codice B-Tree-Insert-Non-Full(x,k) i n[x] if leaf[x] then while i 1 and k < key i [x] key i+1 [x] key i [x] i i - 1 key i+1 [x] = k n[x] n[x] + 1 DiskWrite(x) else while i 1 and k < key i [x] i i - 1 i i + 1 DiskRead c i [x] if n[c i [x]] = 2t – 1 then BTreeSplitChild(x,i,c i [x]) if k > key i [x] then i i + 1 BTreeInsertNonFull(c i [x],k) inserimento di una foglia nodo interno: attraversamento dellalbero

28 Inserimento: esempio G M P X A C D EJ KR S T U VN OY Z G M P X A B C D EJ KR S T U VN OY Z G M P T X A B C D EJ KQ R SN OY ZU V albero iniziale (t = 3) inserimento di B inserimento di Q

29 Inserimento: esempio (2) G M A B C D EJ K LQ R SN OY ZU V T X P C G M A BJ K LQ R SN OY ZU V T X P D E F inserimento di L inserimento di F

30 Inserimento: tempo di CPU I/O su disco: O(h), dato che vengono eseguiti solo O(1) accessi a disco durante le chiamate ricorsive a BTreeInsertNonFull CPU: O(th) = O(t log t n) In ogni momento sono presenti O(1) pagine disco in memoria principale

31 Cancellazione di elementi Effettuata ricorsivamente, iniziando dalla radice e percorrendo lalbero ricorsivamente fino al livello delle foglie Si scende ad un nuovo livello dellalbero se il nodo corrente contiene t-1 elementi (mentre per linserimento 2t – 1 elem.) B-tree-Delete gestisce tre diversi casi: –Caso 1: elemento k trovato in una foglia –Caso 2: elemento k trovato in un nodo interno –Caso 3: elemento k probabilmente in un nodo di livello inferiore

32 Caso 1: se lelemento k è nel nodo x, e x è una foglia, cancella k da x Cancellazione (2) C G M A BJ K LQ R SN OY ZU V T X P D E F albero iniziale C G M A BJ K LQ R SN OY ZU V T X P D E F cancellato: caso 1 x

33 cancellazione (3) Caso 2: se la chiave k è nel nodo x, e x non è una foglia, cancella k da x a) Sia y il figlio di x che precede k. Se y ha almeno t chiavi, trova il predecessore k di k nel sottoalbero di radice in y. Ricorsivamente cancella k e sostituisci k con k in x. b) Simmetricamente per il nodo sucessore z c) se sia y che z hanno t-1 chiavi, si inserisce in y sia k che tutti i figli di z (che diventano figli di y). Il nodo y ha 2t-1 chiavi. Ricorsivamente, si elimina k da y.

34 Cancellazione (4) C L A BD E J KQ R SN OY ZU V T X P G cancellato: caso 2c y = k + z - k x - k C G L A BJ KQ R SN OY ZU V T X P D E M cancellato: caso 2a x y

35 Cancellazione - distribuzione Caso 3: se k non è nel nodo interno x, trova il sottoalbero di radice c i [x] che potrebbe contenere k. Se c i [x] ha solo t – 1 elementi, ci si assicura di scendere in un nodo che abbia almeno dimensione t; poi si chiama ricorsivamente loperazione sul sottoalbero scelto. Possibili due casi. a) se c i [x] ha solo t-1 chiavi, ma ha un fratello con almeno t chiavi, aggiungi a c i [x] un altra chiave prendendola da x, poi sposta una chiave dal fratello immediatamente a destra o a sinistra di c i [x] in x e sposta lopportuno figlio dal fratello in c i [x] (distribuzione).

36 Cancellazione – distribuzione (2) C L P T X A BE J KQ R SN OY ZU V ci[x]ci[x] x fratello cancella B B cancellato: E L P T X A CJ KQ R SN OY ZU V... k k A B ci[x]ci[x] x... k k A ci[x]ci[x] B

37 Cancellazione - fusione b) Se c i [x] e tutti i suoi fratelli hanno t – 1 elementi, allora fondi (merge) c i con un fratello, spostando un elemento da x nel nuovo nodo unione e facendolo così diventare il mediano di quel nodo x... l m......l k m... A B x... l k m l m … A B ci[x]ci[x]

38 Cancellazione – fusione (2) laltezza dellalbero diminuisce D cancellato: C L P T X A BE J KQ R SN OY ZU V C L A BD E J KQ R SN OY ZU V T X P cancella D ci[x]ci[x] fratello

39 Cancellazione: tempo di CPU La maggior parte degli elementi sono nelle foglie, quindi la cancellazione avviene più spesso nelle foglie. In questo caso la cancellazione avviene in ununica discesa verso il livello delle foglie La cancellazione di un nodo interno può richiedere un ritorno verso lalto (caso 2) I/O su disco: O(h), dato che si effettuano solo O(1) operazioni su disco durante le chiamate ricorsive Tempo di CPU: O(th) = O(t log t n)

40 Altri metodi di accesso Varianti dei B-tree: B + -tree, B * -tree B + -tree: usati nei data base management systems (DBMS) Schema generale dei metodi di accesso (comune ai B + -tree): –Gli elementi contenenti dati sono memorizzati solo nelle foglie –Gli elementi sono raggruppati in nodi foglie –Ogni elmento in un nodo interno memorizza: un puntatore a un sottoalbero una descrizione compatta dellinsieme di elementi memorizzati nel sottoalbero


Scaricare ppt "B trees. Memoria Memoria principale Piccola e veloce (chips, silicio) Mb10 -8 / 10 -9 sec. Memoria secondaria Grande e lenta (dischi magnetici) Gb10 -3."

Presentazioni simili


Annunci Google