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