B-stablo

Izvor: Hrvatska internetska enciklopedija
(Preusmjereno s B-stabla)
Skoči na:orijentacija, traži

B-stabla su strukture podataka u informatici. Karakteristike su mu potpuna balansiranost, sortiranje podataka po vrijednosti ključa i čuvanje određenog broja elemenata u jednom čvoru stabla. Operacije nad podacima stabla se obavljaju u amortizirano logaritamskom vremenu. B-stablo nalazi primjenu u magnetskim diskovima ili drugim sekundarnim uređajima za pohranu podataka kojima je dopušten izravan pristup.

B-stabla su slična crveno crnim stablima, ali su bolji u minimiziranju I/O operacija. Mnogi sustavi baza podataka za pohranu koriste b-stabla ili varijante b-stabala. Razlika između crveno-crnih stabala jest u tome što b-stabla mogu imati mnogo djece zbog faktora grananja dok im je visina O(lg n), a visina je puno manja nego u crveno-cnih stabala također zbog faktora grananja. Stoga se b-stabla mogu koristiti za skup operacija u vremenu O(lg n).

B-stabla su generalizirana binarna stabla pretraživanja. Ako unutarnji čvor x sadrži n[x] vrijednosti onda x ima n[x] + 1 djece. Vrijednosti u čvoru x se koriste kao točke grananja odvajajući raspon vrijednosti x-a u n[x] +1 podraspona u kojem svako dijete od x-a radi s jednom vrijednošću. Kada pretražujemo vrijednost u b-stablu radimo {n[x] + 1 ) načina odluke baziranih na usporedbi s n[x] vrijenosti u čvoru . Struktura listovnih čvorova razlikuje se od one unutarnjih čvorova.

B-stablo s korijenom Z (korijen je korijen Z) ima sljedeća svojstva:

  • Svaki čvor x ima sljedeća polja:
    • n[x], broj vrijednosti trenutno spremljenih u čvoru x
    • n[x] su spremljene u nepadajućemo redoslijedu tako da su vrijednost [math]\displaystyle{ k_{1}\left[ x \right] }[/math][math]\displaystyle{ k_{2}\left[ x\right] }[/math] ≤ ··· ≤ [math]\displaystyle{ k_{n}\left[ x\right] }[/math]
    • listovni čvor [x], boolean vrijednosti koja je TRUE ako je x listovni čvor i FALSE ako je x unutarnji čvor.
  • Svaki unutarnji čvor x također sadrži n[x[+1 pokazivača [math]\displaystyle{ c_{1}\left[ x \right] }[/math], [math]\displaystyle{ c_{2}\left[ x \right] }[/math], ..., [math]\displaystyle{ c_{n\left[ x \right]+1}\left[ x \right] }[/math]. Listovni čvorovi nemaju djece te su stoga njihova polja [math]\displaystyle{ c_{i}\left[ x \right] }[/math] nedefinirana.
  • Vrijednosti [math]\displaystyle{ vrijednost_{i}\left[ x \right] }[/math] odvajaju raspon vrijednosti spremljene u jednome podstablu: ako je [math]\displaystyle{ v_{i} }[/math] spremljena u prvome stablu s korijenom [math]\displaystyle{ c_{i}\left[ x \right] }[/math] onda [math]\displaystyle{ v_{1}\le vrijednost_{1}\left[ x \right]\le v_{2}\le vrijednost_{2}\left[ x \right]\le ...\le vrijednost_{n\left[ x \right]}\left[ x \right]\le v_{n\left[ x \right]+1} }[/math]
  • Svi listovi imaju jednaku dubinu što na kraju daje visinu stabla (h).
  • Postoje gornje i donje granice broja vrijednosti koje čvor može sadržavati. Ove granice mogu biti izražene u terminima fiksiranih cjelobornih tipova t ≥ 2 i zove se minimalni stupanj B-stabla:
    • Svaki čvor koji nije korijen mora imat najamanje t-1 vrijednosti. Svaki unutarnji čvor koji nije korijen ima stoga najmanje t djece. Ako stablo nije prazno korijen mora imati najmanje jednu vrijednost.
    • Svaki čvor može imati najviše 2t-1 vrijednosti. Stoga unutarnji čvor može imati najviše 2t djece. Kažemo da je čvor pun ako sadrži točno 2t-1 vrijednosti.

Najjednostavnije b-stablo se pojavljuje kada je t = 2. Svaki unutarnji čvor ima 2,3 ili 4 djeteta i imamo 2-3-4 stablo. U praksi se obično koriste mnogo veće vrijednosti.

Osobine

Za B-stablo visine h, sa konstantom k i brojem čvorova n važi sljedeće:

Visina stabla [math]\displaystyle{ h \leq \log_k \left({n+1 \over 2} \right) }[/math]
Minimalan broj čvorova (h > 0) [math]\displaystyle{ n = 1 + 2\sum_{i=0}^{h-1}{(k+1)^i} }[/math]
Minimalan broj elemenata (h > 0) [math]\displaystyle{ n = 1 + 2k\sum_{i=0}^{h-1}{(k+1)^i} }[/math]
Maksimalan broj čvorova [math]\displaystyle{ n = \sum_{i=0}^{h}{(2k+1)^i} }[/math]
Maksimalan broj elemenata [math]\displaystyle{ n = 2k\sum_{i=0}^{h}{(2k+1)^i} }[/math]