Rodzina B-drzew [24.01.2011]

Transkrypt

Rodzina B-drzew [24.01.2011]
Rodzina B-drzew
[24.01.2011]
Piotr Walkowski, 221135
Wrocªaw, 03.02.2011
Spis tre±ci
1 Rodzina B-drzew
2
2 B-Drzewo
2
2.1 oszacowanie wysoko±ci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
2.2 podstawowe operacje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.3 Wyszukiwanie w drzewie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.3.1
Opis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.3.2
Pseudokod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.4 Wstawianie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.4.1
Opis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.4.2
Pseudokod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
3 Usuwanie
3.0.3
5
pseudokod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 B*-drzewa
6
6
4.1 Charakterystyka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
4.2 Operacje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
5 B+drzewa
8
5.1 Charakterystyka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
5.2 Operacje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
1
Rodzina B-drzew
Podstawow¡ jednostk¡ danych w dyskowych operacjach wejscia wyjscia jest blok. Kiedy dane z
dysku s¡ odczytywane, do pami¦ci wczytywany jest caªy blok, a podczas i zapisywania na dysku,
zapisywany jest równie» caªy blok. Zawsze, kiedy »¡da si¦ jakich± danych z dysku, trzeba je najpierw znalezc, a nastepnie umiesci¢ gªowic¦ nad odpowiednim obszarem i poczeka¢, a» dysk obróci
si¦ o tyle, aby gªowica mogªa je odczyta¢. Oznacza to, »e na czas dost¦pu do danych skªada si¦
przynajmniej kilka czynników:
czas dost¦pu = czas wyszukiwania + opó¹nienie rotacyjne + czas transferu
Bez w¡tpienia proces ten»e jest wyj¡tkowo powolny, w porównaniu z przenoszeniem danych w
pami¦ci. Szczególnie dªugi jest pierwszy skªadnik, czas wyszukiwania, jako, »e zale»y on od mechanicznego przemieszczania gªowicy nad wªasciwa sciezk¦ dysku. Opó¹nienie rotacyjne to czas
potrzebny na to, aby gªowica znalazªa si¦ dokªadnie nad odpowiednim blokiem i ±rednio jest to
czas potrzebny na wykonanie poªowy obrotu. Je»eli program stale u»ywa informacji z zewn¦trznych
no±ników, projektuj¡c dany system nale»y okresli¢ ich natur¦. Przykªadowo drzewo binarne poszukiwania mo»e rozci¡ga¢ si¦ na wiele ró»nych bloków dysku, tak, »e np. ±rednio ma miejsce dost¦p
do dwóch bloków. Kiedy takie drzewo jest cz¦sto u»ywane, dost¦py te mog¡ znacz¡co spowolni¢
dziaªanie programu. Poza tym wstawianie kluczy do drzewa i ich usuwanie wymaga tak»e wielu
dost¦pów do poszczególnych bloków danych. Binarne drzewo poszukiwania, które jest notabene
dobrym narz¦dziem, kiedy znajduj¦ si¦ calkowicie w pami¦ci okazuje si¦ by¢ nieodpowiednie. W
przypadku zewn¦trznych no±ników danych taka struktura danych zawodzi z racji konieczno±ci si¦gania stale do bloków danych co znacznie spowalnia prac¦. Prost¡ konkluzj¡ jest to, »e lepiej, w
takim przypadku si¦ga¢ po du»e ilo±ci danych na raz zamiast przemieszcza¢ si¦ ci¡gle w celu odczytu
niewielkich bloków danych. Najlepiej jest zatem tak zorganizowa¢ dane, aby takich odczytów byªo
mo»liwie najmniej.
2
B-Drzewo
Jedna ze struktur danych, która znajduje szczególne zastosowanie, w programach bazodanowych
jest B-drzewo. Zostaªa ona wymy±lona przez par¦: Bayer, McCreight, w roku 1972. B-drzewa
s¡ ±ci±le zwi¡zane z no±nikami zewn¦trznymi i mog¡ by¢ dostosowane do no±nika tak, aby minimalizowa¢ zwi¡zane z nim opó¹nienia. Wa»na cecha tej struktury jest to, »e wielko±¢ ka»dego w¦zªa
mo»e by¢ równa wielko±ci bloku. Liczba kluczy, w w¦¹le mo»e by¢ ró»na, w zale»no±ci od wielko±ci
tych»e kluczy, organizacji danych czy oczywi±cie od wielko±ci bloku. Ilo±¢ iformacji zapisywana w
pojedynczym we¹le B-drzewa mo»e by¢ wi¦c stosunkowo du»a.
Formalnie B-Drzewo to struktura drzewiasta struktura danych z korzeniem T, speªniaj¡ca nast¦puj¡ce warunki:
(1) Korze«, je±li nie jest li±cie to ma przynajmniej dwa poddrzewa
(2) Ka»dy w¦zeª nieb¦d¡cy li±ciem ani korzeniem ma k-1 kluczy i k wska¹ników na poddrzewa.
Gdzie [ m2 ] <= k <= m
2
(3) Ka»dy w¦zeª który jest li±ciem ma k-1 kluczy, gdzie [m-2] <=k<=m
(4) Wszystkie li±cie znajduj¡ si¦ na tym samym poziomie
Zgodnie z podanymi warunkami B-drzewo jest zawsze przynajmniej do poªowy wypeªnione, ma
kilka poziomów i jest caªkowicie zrównowa»one. W¦zeª B-drzewa cz¦sto implementuje sie jako klase
zawierajaca tablice m-1 komorek na klucze, tablice z m komórkami na wskazniki na inne wezªy
oraz ewentualnie inne wska¹niki uªatwiaj¡ce obsªug¦ drzewa, jak liczba kluczy w w¦¹le oraz aga
okre±laj¡ca czy dany w¦zeª jest li±ciem.
Istnieje pewne podobienstwo do drzew czerwono czarnych, bowiem w obojgu strukturach li±cie znajduj¡ si¦ na tym samym poziomie, a tak»e ka»da operacja jest wykonywana w czasie logarytmicznym
wzgledem wysoko±ci drzewa.
2.1
oszacowanie wysoko±ci
Przypadek pesymistyczny dla wyszukiwania w drzewie to sytuacja kiedy B-drzewo ma najmniejsz¡
dozwolon¡ liczb¦ wska¹ników, w w¦zª¡ch nieb¦d¡cych korzeniem, q = [ m2 ], za± szukany jest lis¢
(który mo»e, ale nie musi istnie¢).
W takim wypadku je»eli wysoko±¢ oznaczymy jako h, jest:
Jeden klucz w korzeniu
2(q − 1) kluczy na drugim poziomie
2q(q − 1) kluczy na trzecim poziomie
...
2q h − 2(q − 1) kluczy w lisiach (poziom h)
co korzystaj¡c z wzoru P
na sum¦ elementów ci¡gu geometrycznego daj¦:
h−2
2q i )(q − 1) kluczy, w B-drzewie.
1 + ( i=0
w zwi¡zku z tym mo»na wyrazi¢ liczb¦ kluczy B-drzewa, w przypadku pesymistycznym jako:
Ph−2 i
h−1
1 + 2(q − 1)( i=0
q ) = 1 + 2(q − 1)( q q−1−1 ) = −1 + 2q h−1
Zatem zwi¡zek liczby kluczy n i wysoko±ci h wyra»a si¦:
n >= −1 + 2q h−1
Po zlogarytmowaniu wzgl¦dem zmiennej h otrzymujemy:
h <= logq n+1
2 +1
3
2.2
podstawowe operacje
2.3
Wyszukiwanie w drzewie
2.3.1 Opis
Algorytm znajdowania klucza w B-drzewie jest do±¢ prosty i nie wymaga specjalnego komentarza.
Najpro±ciej bior¡c jest on 'rozszerzeniem' wyszukiwania stosowanego w drzewach BST z tym, »e,
w ka»dym w¦¹le decydujemy do którego z dzieci zej±¢, gdzie ich liczba jest zwykle du»o wi¦ksza od
dwóch.
2.3.2 Pseudokod
BTreeNode f i n d ( key K, Node ∗ n )
i f ( node != 0)
f o r ( i =1; i <= node−>k e y s A r i t y && node−>keys [ i − 1] < K; i ++);
i f ( i > node−>k e y s A r i t y | | node−>keys [ i − 1] > K)
r e t u r n f i n d (K, node−>p t r [ i − 1 ] ) ;
e l s e r e t u r n node
e l s e return n i l
2.4
Wstawianie
2.4.1 Opis
Zarówno wstawianie nowego klucza, jak i jego usuwanie s¡ operacjami trudnymi, je±li wzi¡¢ pod
uwag¦ fakt. ze wszystkie li±cie musz¡ znajdowa¢ si¦ na ostatnim poziomie. Implementowanie
wstawiania elementów staje si¦ prostsza, kiedy zmieni si¦ metod¦ tworzenia drzewa. Je±li pierwszy
napotkany klucz jest najmniejszym z kluczy, klucz ten jest wstawiany do korzenia, a ostatecznie
korze« nie ma wcale lewego poddrzewa, chyba »e podj¦te zostan¡ kroki w celu zrównowa»enia
drzewa. Drzewo mozna jednak budowa¢ takze od doªu tak, aby korze« stale si¦ zmieniaª, a jego
ostateczna warto±¢ byªa znana dopiero po zako«czeniu budowy drzewa. Tak wªa±nie wstawia si¦
klucze do B-drzew. Je±li dany jest klucz do wstawienia, przechodzi si¦ bezpo±rednio do li±cia i,
je±li jest tam miejsce, wstawia si¦ go tam. Kiedy li±¢ jest ju» peªny, tworzony jest nowy li±¢,
klucze s¡ dzielone mi¦dzy te dwa li±cie (stary i nowy), jeden za± przechodzi do rodzica. Je±li takze
rodzic jest peªny, proces jest powtarzany a» do skutku; mo»e si¦ zdarzy¢, »e stary korze« zostanie
zast¡piony przy tym nowym. Aby opisany proces bardziej uporz¡dkowa¢, omówione zostan¡ trzy
typowe sytuacje zwi¡za- ne ze wstawianiem do B-drzew nowych kluczy:
4
Zªo»ona operacja wstawiania klucza 13 do drzewa
2.4.2 Pseudokod
void insert (k)
znajdz l i s c , w ktorym wstawiony zostanie klucz K
while ( true )
znajdz odpowiednie miejsce na K w tablicy keys ;
i f wezel node nie j e s t pelny
wstaw K i zwieksz keyArity ;
return
e l s e podziel node na node1 node2 # node1 = node , node2 j e s t nowy
rozloz klucze i wskazniki rowno miedzy node1 i node2 oraz z a i n i c j u j keyArity
K = srodkowy klucz sposrod kluczy z node i K
i f node byl korzeniem
utworz nowy k o r z e jako rodzica node1 i node2
wstaw K i wskazniki na node1 i node2 w korzeniu , ustaw jego keyArity na 1
e l s e node = jego rodzic # teraz przetwarzany j e s t rodzic wezla node
return
16
3
Usuwanie
Usuwanie z B-drzewa jest analogiczne do wstawienia, cho¢ jest troch¦ bardziej skomplikowane.
Zamiast podawa¢ pseudokod dla operacji usuwania, lepiej opisa¢ j¡ sªowami. Usuwanie klucza jest
realizowane za pomoc¡ rekurencyjnej procedury
Wszystko jest realizowane dzi¦ki rekurencyjnej procedurz¦ B-Tree-Delete. Zaªó»my, »e chcemy
usun¡¢ klucz k z poddrzewa o korzeniu w w¦¹le x. Procedura B-Tree-Delete jest zaprojektowana
w taki sposób, »eby byl speªniony nast¦puj¡cy niezmiennik: Kiedykolwiek nast¦puje wywoªanie
rekureneyjne B-Tree-Delete dla w¦zªa x ró»nego od korzenia, w tym w¦¹le jest co najmniej t kluczy,
gdzie t jest minimalnym stopnian w¦zªa w drzewie. Zauwa»my, i» dzi¦ki temu, »e x ma o jeden klucz
wi¦cej, ni» jest to wymagane, istnieje mo»liwo±¢ przesuni¦cia w razie konieczno±ci jednego klucza do
syna, do którego nast¦puje zej±cie rekurencyjne. Powy»szy niezmiennik umo»liwia usuni¦cie klucza
5
z drzewa w jednym przej±ciu W dóª drzewa, bez konieczno±ci powracania w kierunku korzenia (z
jednym wyj¡tkiem, o którym poni»ej)
3.0.3 pseudokod
Usuwanie z B-drzewa wykonujemy nast¦puj¡co:
1. Je±li klucz k jest w w¦¹le x i x jest li±ciem to usun klucz k z x
2. Je»eli klucz k jest w w¦¹le x i x jest w¦zª¦m wewn¦trznym to wykonaj co nast¦puje:
(a) Niech y b¦dzie synem x poprzedzaj¡cym k. Je±li y ma co najmniej t kluczy, to w poddrzewie o
korzemu w y wyznacz poprzednik k' klucza k. Rekurencyjnie usu« k' i w w¦¹le x zast¡p k przez k'
(Wyznaczenie k' i usuni¦cie go z poddrzewa moze by¢ wykonane w jednym przejsciu w dóª drzewa)
(b) Symetryczme, je±li syn z, ktory wyst¦puje po k w w¦¹le x, ma co najmniej t kluczy, to wyznacz
nast¦pnik k' dla k w poddrzewie o korzeniu w z. Rekur¦ncyjnie usu« k' i zast¡p k przez k' w
x. (Wyznaczenie k' i usuni¦cie go z poddrzewa mo»e by¢ wykonane w jednym przej±ci w dóª
poddrzewa).
(c) Je±li obaj synowie y i z maj¡ tylko po t-1 kluczy, to przenie± k oraz wszsytko z w¦zªa z do
y. W wyniku tej operacji klucz k i wska¹nik do z zostaj¡ usuni¦te z x. Nast¦pnie zwolnij pami¦¢
przydzielon¡ dla z i usu« rekurencyjnie k z y.
3. Je±li klucz k nie wystepuje w wewnetrznym w¦¹le x, to wyma» korze« ci [x] poddrzewa, w
którym musi znajdowa¢ si¦ k (je±li tylko jest w drzewie). Je±li ci [x] ma tylko t - 1 kluczy, to
wykonaj podkrok 3a lub 3b w celu zagwarantowania, »e zej±cie rekurencyjne nast¦puje do w¦zªa
zawieraj¡cego conajmniej t kluczy. Nast¦pnie usu« rekurencyjnie k z wªa±ciwego poddrzewa.
(a) Je±li w w¦¹le ci [x] jest tylko t-1 kluczy, ale jeden z jego s¡siednich braci ma t kluczy, to umie±¢
w ci [x] dodatkowy klucz, przesuwajac odpowiedni klucz z x, a w jego miejsce przenosz¡c klucz z
lewego lub prawego brata - z tego, który zawiera t kluczy. Na koniec przesu« jeszcze z wybranego
brata do ci [x] wska¹nik do odpowiedniego syna.
(b) Je±li ci [x] i s¡siedzi bracia maj¡ po t − 1 kluczy to poª¡cz ci z jednym z s¡siednich braci, przesuwaj¡c odpowiedni klucz z x do nowo powstaªego w¦zªa. Przesuni¦ty klucz jest kluczem ±rodkowym
w nowym w¦¹le.
4
4.1
B*-drzewa
Charakterystyka
B*-drzewo to odmiana B-drzewa stworzona przez Donalda Knutha, jego nazwa zostaªa za- proponowane przez Douglasa Comera. W B*-drzewie wszystkie w¦zªy poza korzeniem musz¡ by¢
6
wypeªnione przynajmniej w dwóch trzecich, a nie tylko w poªowie, jak zwykªe B-drzewa. ‘ci±lej
rzecz bior¡c, liczba kluczy we wszystkich w¦zªach B-drzewa rz¦du m nieb¦d¡cych korzeniami musi
wynosi¢ k dla [ 2m−1
3 ] <= k <= m − 1 Cz¦sto±¢ podziaªów w¦zªów ogranicza si¦, opó¹niaj¡c podziaª,
a kiedy juz do niego dochodzi, dziel¡c dwa w¦zªy na trzy, a nie jeden na dwa. Badania statystyczne pokazuj¡, »e ±rednia zaj¦to±¢ B*-drzew wynosi 81/100 (Leung l984). Struktura ta znalazªa
zastosowanie chocia»by w systemie plików reiserFS.
4.2
Operacje
Wobec tego, ze kazdy w¦zeª B-drzewa odpowiada blokowi no±nika zewn¦trznego, si¦ganie do jednego
w¦zªa oznacza jeden dost¦p do tego no±nika, co jest kosztowne w porównaniu z dost¦pem do kluczy
w¦zªa znajduj¡cych si¦ w pami¦ci. Wobec tego im mniej w¦zªów zostanie utworzonych. tym lepiej.
Podziaª w B*-drzewie opó¹nia si¦, próbuj¡c rozªo»y¢ klucze mi¦dzy w¦zeª a jego s¡siada w razie
niedopeªnienia. Šatwo zauwa»y¢,»e nie tylko równo dzieli si¦ klucze, ale w w¦¹le, który byª peªny,
pojawiaj¡ si¦ puste miejsca pozwalaj¡ce wstawi¢ nowe klucze.Ponadto je±li pelny jest tak»e s¡siad,
dochodzi do podziaªu - tworzony jest jeden nowy w¦zeª, klucze z w¦zªa i jego s¡siada (wraz z kluczem
rozdzielaj¡cym z rodzica) s¡ równomiemie rozkªadane mi¦dzy trzy w¦zªy, za± do rodzica wstawiane
s¡ dwa klucze rozdzielaj¡ce. Wszystkie trzy w¦zªy uczestnicz¡ce w podziale b¦d¡ na pewno pelne
przynajmniej w dwóch trzecich.
O ile w¦zeª oraz jego s¡siedzi s¡ peªni, w B* drzewie dochodzi do podziaªu - tworzony jest nowy
w¦zeª, natomiast klucze s¡ rozdzielane równo pomi¦dzy trzy.
7
5
5.1
B+drzewa
Charakterystyka
Wobec faktu, ze jeden w¦zeª B-drzewa odpowiada jednej stronie lub blokowi no±nika zewn¦trznego,
przej±cie z jednego w¦zªa do innego wymaga czasochªonnego zmieniania strony. Wobec tego wskazana
byªaby niewielka ilo±¢ dost¦pów do w¦zªa. Przchodzenie bezpo±rednie po drzewie pozwala ªatwo to
zaimplementowa¢, ale w przypadku w¦zªów innych niz ko«cowe równocze±nie pokazywany jest tylko
jeden klucz, a potem konieczny jest dost¦p do innej strony. Wobec tego dobrze byªoby rozszerzy¢ B-drzewa tak, aby umo»liwi¢ szybsze si¦ganie do kolejnych danych ni» przy zastosowaniu
przechodzenia bezpo±redniego. Rozwi¡zanie takie udost¦pnia B+drzewo W B-drzewie odwoªania
do danych mog¡ pojawia¢ si¦ w dowolnych w¦zªach; za± w B+drzewie tylko w li±ciach. W¦zªy
wewn¦trzne B+drzewa to indeksy pozwalaj¡ce na szybki dost¦p do danych; ta cz¦±¢ drzewa nazywana jest zbiorem indeksów. Li±cie maj¡ imi¡ struktur¦ ni» reszta w¦zªów B+drzewa i zwykle s¡
poª¡czone w jak lista cykliczna. Warto zauwa»y¢, ze w¦zªy wewn¦trzne zawieraj¡ klucze, wska¹niki
i licznik kluczy. Li±cie zawieraj¡ klucze, wska¹niki rekordów W pliku danych zwi¡zanym z kluczami
oraz wska¹niki na nast¦pny li±¢. Za twórc¦ tej»e struktury uwa»a si¦ D. Comera, który na ramach
ACM zaprezentowaª prac¦ pt. "the ubiquitous B-tree"w roku 1979, jednak»e sam autor wspominaª,
»e koncepcje B+drzew byªy rozwa»ane nieco wcze±niej (by¢ mo»e nawet w 1974) przez pracowników
z IBM research.
5.2
Operacje
Operacje B+-drzewa nieznacznie ró»ni¡ si¦ od operacji B-drzewa. Wstawianie klucza do li±cia
maj¡cego jeszcze wolne miejsca wymaga ustawienia kluczy tego li±cia w kolejno±ci. W zbiorze
indeksów nie powoduje to zadnych zmian. Je±li klucz jest wstawiany do peªnego ju» li±cia, li±¢
jest dzielony, nowy li±¢ jest doª¡czany do drzewa, za± klucze s¡ dzielone mi¦dzy stare i nowy li±¢;
pierwszy klucz z nowego w¦zªa jest kopiowany (nie przenoszony, jak w B-drzewie) do rodzica. Je±li
rodzic nie jest peªny, mo»e to wymaga¢ co najwy»ej lokalnego przesuni¦cia kluczy w rodzicu.
Literatura
[1] Douglas Comer, The Ubiquitous B-Tree, ACM 1979
[2] Raghu Ramakrishnan, Johannes Gehrke; Database Management Systems, 2000
[3] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Wprowadzenie do algorytmów,
WNT, 2005
8

Podobne dokumenty