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 5 3.0.3 pseudokod...................................... 6 4 B*-drzewa 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 [ m 2 ] <= 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 = [ m 2 ], 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 na sum elementów ci gu geometrycznego daj : 1 + ( h 2 i=0 2qi )(q 1) kluczy, w B-drzewie. w zwi zku z tym mo»na wyrazi liczb kluczy B-drzewa, w przypadku pesymistycznym jako: 1 + 2(q 1)( h 2 i=0 qi ) = 1 + 2(q 1)( qh 1 1 ) = 1 + 2qh 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 <= log q n+1 2 + 1 q 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 >keysarity && node >keys [ i 1] < K; i ++); i f ( i > node >keysarity node >keys [ i 1] > K) return f i n d (K, node >ptr [ i 1 ] ) ; e l s e return 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 v o i d i n s e r t ( k ) z n a j d z l i s c, w ktorym wstawiony z o s t a n i e k l u c z K w h i l e ( t r u e ) z n a j d z odpowiednie m i e j s c e na K w t a b l i c y keys ; i f w e z e l node n i e j e s t p e l n y wstaw K i z w i e k s z k e y A r i t y ; r e t u r n e l s e p o d z i e l node na node1 node2 # node1 = node, node2 j e s t nowy r o z l o z k l u c z e i w s k a z n i k i rowno miedzy node1 i node2 o r a z z a i n i c j u j k e y A r i t y K = srodkowy k l u c z s p o s r o d k l u c z y z node i K i f node b y l korzeniem utworz nowy k o r z e j a k o r o d z i c a node1 i node2 wstaw K i w s k a z n i k i na node1 i node2 w k o r z e n i u, ustaw j e g o k e y A r i t y na 1 e l s e node = j e g o r o d z i c # t e r a z przetwarzany j e s t r o d z i c wezla node r e t u r n 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«c i [x] poddrzewa, w którym musi znajdowa si k (je±li tylko jest w drzewie). Je±li c i [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 c i [x] jest tylko t-1 kluczy, ale jeden z jego s siednich braci ma t kluczy, to umie± w c i [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 c i [x] wska¹nik do odpowiedniego syna. (b) Je±li c i [x] i s siedzi bracia maj po t 1 kluczy to poª cz c i 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 B*-drzewa 4.1 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 B+drzewa 5.1 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