You are on page 1of 4

Un arbore B este un arbore de cutare multici echilibrat, adaptat memoriilor

externe cu acces direct. Un arbore B de ordinul n are urmtoarele proprietti:

- Rdcina fie nu are succesori, fie are cel putin doi succesori.

- Fiecare nod interior (altele dect rdcina si frunzele) au ntre n/2 si n


succesori.

- Toate cile de la rdcin la frunze au aceeasi lungime.

- Nodurile interne contin doar chei si pointeri la alte noduri, iar datele asociate
fiecrei chei sunt memorate n frunze.

- Toate nodurile au aceeasi structur, continnd att chei ct si date asociate


cheilor.

Fiecare nod (intern) contine o secvent de chei si adrese ale fiilor de forma
urmtoare:

p[0], k[1], p[1], k[2], p[2],...,k[m], p[m] ( n/2 <= m <= n)

unde k[1]<k[2]<...k[m] sunt chei, iar p[0],p[1],..p[m] sunt legturi ctre nodurile
fii (pseudo-pointeri, pentru c sunt adrese de octet n cadrul unui fisier disc).

In practic, un nod contine zeci sau sute de chei si adrese, iar nltimea
arborelui este foarte mic (rareori peste 3). Pentru un arbore cu un milion de
chei si maxim 100 de chei pe nod sunt necesare numai 3 operatii de citire de pe
disc pentru localizarea unei chei, dac toate nodurile contin numrul maxim de
chei): radacina are 100 de fii pe nivelul 1, iar fiecare nod de pe nivelul 1 are 100
de fii pe nivelul 2, care contin cte 100 de chei fiecare.Toate cheile din
subarborele cu adresa p[0] sunt mai mici dect k[1], toate cheile din
subarborele cu adresa p[m] sunt mai mari dect k[m], iar pentru orice 1<=i<n
cheile din subarborele cu adresa p[i] sunt mai mari sau egale cu k[i] si mai mici
dect k[i+1].

Arborii B pot fi priviti ca o generalizare a arborilor 2-3-4 si cunosc mai multe


variante de implementare:

- Date si n nodurile interioare (B) sau date numai n noduri de pe ultimul nivel
(B+
).

- Numrul minim de chei pe nod si strategia de spargere a nodurilor (respectiv


de contopire noduri cu acelasi printe): n/2 sau 2n/3 sau 3n/4.

Arborii B au dou utilizri principale:

- Pentru dictionare cu numr foarte mare de chei, care nu pot fi pstrate


integral n memoria RAM;

- Pentru fisiere index asociate unor fisiere foarte mari (din baze de date), caz n
care datele asociate cheilor sunt adrese disc din fisierul mare indexat.

Cu ct ordinul unui arbore B (numrul maxim de succesori la fiecare nod) este


mai mare, cu att este mai mic nltimea arborelui si deci timpul mediu de
cutare.

Cutarea unei chei date ntr-un arbore B seamn cu cutarea ntr-un arbore
binar de cutare BST, dar arborele este multici si are nodurile pe disc si nu n
memorie.

Nodul rdcin nu este neaprat primul articol din fisierul arbore B din cel
putin dou motive:

- Primul bloc (sau primele blocuri, functie de dimensiunea lor) contin informatii
despre structura fisierului (metadate): dimensiune bloc, adresa bloc rdcin,
numrul ultimului bloc folosit din fisier, dimensiune chei, numr maxim de chei
pe bloc, s.a.

- Blocul rdcin se poate modifica n urma cresterii nltimii arborelui,


consecint a unui numr mai mare de articole adugate la fisier.

Fiecare bloc disc trebuie s contin la nceput informatii cum ar fi numrul de


chei pe bloc si (eventual) dac este un nod interior sau un nod frunz.

Insertia unei chei ntr-un arbore B ncepe prin cutarea blocului de care
apartine noua cheie si pot apare dou situatii:

- mai este loc n blocul respectiv, cheia se adaug si nu se fac alte modificri;

- nu mai este loc n bloc, se sparge blocul n dou, mutnd jumtate din chei n
noul bloc alocat si se introduce o nou cheie n nodul printe (dac mai este
loc). Acest proces de aparitie a unor noi noduri se poate propaga n sus pn la
rdcin, cu cresterea nltimii arborelui B.

Urmeaz cteva functii pentru operatii cu arbori B si structurile de date folosite


de aceste functii:

PROCEDURE B-TREE-SEARCH (x , k)
begin

i=1

while ( i <= n[x] and k > keyi[x] )

do ( i <- i + 1);

if ( i <= n[x] and k = keyi[x] )

then return (x, i)

if ( leaf[x] ) then return NIL;

else Disk-Read(ci[x])

return B-Tree-Search(ci[x], k);

end;

PROCEDURE B-TREE-INSERT(T, k)
begin

r = root[T]

if ( n[r] == 2t 1){

s <- Allocate-Node()
root[T] = s

leaf[s] = FALSE

n[s] = 0

c1[s] = r

B-Tree-Split-Child(s, 1, r)

B-Tree-Insert-Nonfull(s, k)

} else

B-Tree-Insert-Nonfull(r, k)

end;

n cazul tergerii unei chei dintr-o pagin cu m/2 chei, paii sunt:

Dac pagina din dreapta are mai mult dect numrul minim de chei,
atunci luam pe cea mai mic de aici.

Altfel, dac pagina din stnga are mai mult dect numrul minim de chei,
atunci luam pe cea mai mare de aici.

Altfel, daca ambii copii au amndoi numrul minim de chei, atunci:

Se creaz o nou pagin cu toate cheile din pagina in care se afl


cheia pe care vrem s o tergem, toate cheile dintr-un frate i cheia
median din printe. Se obine astfel o pagin plin cu chei din
care putem terge. Aceast operaie unete doi copii: micoreaz
numrul de chei din printe i corespunztor numrul de copii.

Aceast operaie de unire este inversa operaiei de imprire (en.,


split).

You might also like