Temat: Struktury do przechowywania danych w pamici zewntrznej. B - drzewa. B * - drzewa. B + - drzewa. Podstawow jednostk w operacjach wejcia - wyjcia zwizanych z dyskiem (pamici zewntrzn) jest blok. czas dostpu czas szukania cieki + bezwładno obrotowa (ok. 1/2 obrotu) + czas przesyłania 1
Przykład Załómy, e dysk ma nastpujce parametry: 40 ms trwa znalezienie cieki, wykonuje 3000 obrotów na minut, przesyła dane do pamici wewntrznej z prdkoci 1000 kb/s. 1. Odczytujemy blok 5kB z dysku i przesyłamy do pamici wewntrznej: czas dostpu = 40 ms + 10 ms +5 ms = 55 ms 2. Odczytujemy dwa bloki po 5 kb z dysku i przesyłamy do pamici wewntrznej: czas dostpu = 2 ( 40 ms + 10 ms + 5 ms) = 110 ms 3. Odczytujemy blok 10 kb z dysku i przesyłamy do pamici wewntrznej: czas dostpu = 40 ms + 10 ms +10 ms = 60 ms Kady dostp do dysku jest bardzo kosztowny. Dane w pamici zewntrznej powinny by ujte w tak struktur, która minimalizuje liczb dostpów. 2
Przyjmijmy, e w pliku znajduje si n danych. Rozmiar bloku danych, który przesyłamy do pamici wewntrznej wynosi k. Rozwaamy algorytmy realizacji operacji słownikowych: search(d, S) - wyszukiwanie danych d w zbiorze S insert(d, S) - dodanie danych d do zbioru S delete(d, S) - usuwanie danych d ze zbioru S. 1. Pliki nieuporzdkowane Jeden dostp do pliku realizuje zapis albo odczyt bloku zawierajcego k danych. search(d, S) : Algorytm wyszukiwania polega na przesłaniu co najwyej n/k bloków. insert(d, S) : Algorytm wstawianiu wymaga przesłania co najwyej n/k bloków w celu sprawdzenia, czy element d S. Jeeli ostatni blok jest pełny i d S, to element d jest wstawiany do nowego, n/k+1 bloku i nowy blok jest przesłany (zapisywany) w pliku. Tak wic koszt pesymistyczny całej operacji wynosi n/k+1. 3
delete(d, S) : Algorytm usuwania wymaga przesłania co najwyej n/k bloków w celu sprawdzenia, czy element d S. Jeeli element d znajdował si w bloku o numerze i, to blok ten jest uzupełniany ostatnim elementem z bloku o numerze n/k, a nastpnie zostaje zapisany jako blok o numerze i. Zmieniony ostatni blok pliku jest równie zapisywany na dysku, o ile po usuniciu z niego elementu ni stał si pusty. Koszt całkowity operacji delete wynosi wic: i+1+2. Jeeli i = n/k-1, to koszt wynosi: n/k-1+1+2=n/k+2 i jest to koszt pesymistyczny operacji delete. l l d 1 2 3... i... n/k-1 n/k Podstawow wad tej struktury jest: - długi czas działania operacji, - zestaw danych jest nieuporzdkowany. Podstawow zalet natomiast jest to, e: - nie jest uywana dodatkowa pami, - prostota algorytmów. 4
Struktura plików nieuporzdkowanych moe by zastosowana, gdy dane s zawsze przetwarzane sekwencyjnie, bez wykorzystania porzdku. 2. Struktury danych realizujce wyłcznie wyszukiwanie w pliku danych a) Pliki z funkcj mieszajc Załómy, e mamy okrelon funkcj mieszajc: { 0,1,... n / k 1} h : U, gdzie U jest uniwersum słownika Wartoci funkcji haszujcej jest numer bloku, w którym powinien znajdowa si wyszukiwany element. Tablica haszujca zawiera adresy bloków. Tablica ta jest równie zapisana na dysku. Algorytm wyszukiwania polega na przesłaniu do pamici wewntrznej bloku o numerze h(d). Koszt operacji jest zatem stały. Zalet tej metody jest bardzo szybki czas realizacji operacji search. Wad jest zuycie dodatkowej pamici dyskowej na tablic haszujc. Struktura taka nie powinna by uywana, gdy słownik jest modyfikowany, czyli realizowane jest usuwanie bd wstawianie. 5
b) Sekwencyjne pliki indeksowe W tej metodzie dane przechowywane s w tzw. pliku głównym, uporzdkowanym wg danej relacji. Oprócz pliku głównego tworzony jest plik pomocniczy nazywany indeksem rzadkim. Dla kadego bloku pliku głównego w indeksie rzadkim znajduje si para (v, b), gdzie b jest adresem (numerem) bloku, a v najmniejsz dan w bloku według relacji porzdkujcej. Plik główny i indeks rzadki (1, 1) (9, 2) (17, 3) (51, 4)... 1: 1 2 5 8 2: 9 10 13 15 3: 17 18 45 49 4: 51 53 80 91 Zauwamy, e plik główny ma n/k bloków, a indeks rzadki n/k 2 bloków. Algorytm wyszukiwania search(d, S) realizuje albo: sekwencyjne przegldanie bloków indeksu rzadkiego, a do momentu: (*) znalezienia bloku (v, b) w pliku indeksu rzadkiego takiego, e v>d. Do pamici wewntrznej przesyłany jest blok b-1. Jeeli dla wszystkich par indeksu rzadkiego warunek v>d nie jest spełniony, to przesyłamy ostatni blok pliku głównego. Koszt pesymistyczny operacji wyszukiwania wynosi 1+n/k 2 6
albo binarne wyszukiwanie bloku spełniajcego warunek (*). Koszt pesymistyczny operacji wyszukiwania wynosi wówczas 2+log 2 n/k 2. Zalet tej struktury jest niski czas wyszukiwania (zwłaszcza przy zastosowaniu wyszukiwania binarnego) i fakt, e dane w pliku s uporzdkowane. Wad natomiast jest konieczno utworzenia dodatkowego pliku indeksu rzadkiego i fakt, e nie opłaca si w tej strukturze, ze wzgldu na wysoki koszt czasowy, realizacja pozostałych operacji słownikowych. 3. Definicja B - drzewa ( B - drzewo klasyczne) B - drzewo T jest drzewem wielokierunkowym z korzeniem o nastpujcych własnociach: 1. Kady wzeł x ma nastpujce pola: (a) n[x] - liczba kluczy aktualnie zapamitanych w wle x, (b) n[x] kluczy zapamitanych w porzdku niemalejcym key 1 [x] key 2 [x]... key n[x] [x] (key i [x]- i - ty klucz w wle x) (c) leaf[x] - pole logiczne, którego wartoci jest 1, jeli x jest liciem albo 0, jeli x jest wzłem wewntrznym. Typ wskanika na wzeł B - drzewa oznaczmy przez wsk. 7
2. Jeli x jest wzłem wewntrznym, to zawiera take n[x]+1 wskaników do synów c 1 [x], c 2 [x], c n[x]+1 [x]. Licie nie maj synów, wic ich pola c i nie s zdefiniowane. Schemat budowy wzła wewntrznego x typu wsk n[x] key 1 [x] key 2 [x]... key n[x] [x] leaf[x] c 1 [x] c 2 [x]... c n[x] [x] c n[x]+1 [x] 3. Klucze key i [x] rozdzielaj przedziały kluczy pamitanych w poddrzewach: Jeli k i jest dowolnym kluczem z poddrzewa o korzeniu c i [x], to k key [ x] k 2 key 2[ x] key n[ x][ x] k n[ x] 1 1 1... + 4. Wszystkie licie le na tej samej głbokoci. 5. Istniej dolne i górne ograniczenia na liczb kluczy w danym wle. Ograniczenia te zale od ustalonej liczby całkowitej t 2 nazywanej minimalnym stopniem B-drzewa. (a) Kady wzeł róny od korzenia musi mie co najmniej t-1 kluczy. Kady wzeł wewntrzny róny od korzenia ma zatem co najmniej t synów. Jeli drzewo jest niepuste, to korze musi mie co najmniej jeden klucz. (b) Kady wzeł moe zawiera co najwyej 2t-1 kluczy. Dlatego kady wzeł wewntrzny moe mie co 8
najwyej 2t synów. Powiemy, e wzeł jest pełny, jeli zawiera dokładnie 2t-1 kluczy. Najprostsze B-drzewo ma minimalny stopie t = 2. Kady wzeł wewntrzny ma wtedy 1, 2 lub 3 synów. W praktyce uywa si duo wikszych wartoci t (co najmniej 100). Przykład B-drzewo o minimalnym stopniu t = 3. Kady wzeł wewntrzny róny od korzenia ma co najmniej t-1=2 kluczy i co najwyej 2t-1=5 kluczy. Kady wzeł wewntrzny ma 6 wskaników. 1 30 0 2 10 20 0 2 40 60 0 3 1 3 4 1 4 12 13 14 18 1 4 22 24 26 28 1......... 4. Maksymalna wysoko B- drzewa Mona si spodziewa, e koszt operacji słownikowych zrealizowanych na B-drzewie zasadniczo zaley od jego wysokoci. Przez n oznaczymy rozmiar słownika. Jaka bdzie maksymalna wysoko B-drzewa dla danego n 1 i minimalnego stopnia t 2? 9
Jeeli B - drzewo ma wysoko h, to liczba jego wzłów jest najmniejsza, gdy korze zawiera jeden klucz, a wszystkie pozostałe wzły zawieraj t-1 kluczy. 1... t-1 t-1 t-1... t-1 t-1... t-1 t-1... t-1 t-1... t-1 t-1... t-1 t-1... t-1 Głboko Liczba wzłów 0 1 1 2 2 2t 3 2t 2 4 Std: n 1+ h 1 1 i 1 h ( t 1) 2t = 1+ 2( t 1) = 2t 1 i= 1 n + 1 h logt 2 t t h 4. Wyszukiwanie w B-drzewie x - wskanik na B-drzewo, k - poszukiwany klucz Jeeli k znajduje si w drzewie, to wartoci funkcji B_tree_search jest wskanik na wzeł, w którym znajduje si poszukiwany klucz. Jeeli k nie ma w drzewie, to funkcja zwraca adres pusty. 10
B_tree_search(x, k) i=1; while (i<=n[x] && k>key i [x]) i++; if (i<= n[x] && (k == key i [x]) return x; if (leaf[x]) return NULL; else { Disk_Read(c i [x]); return B_tree_search(c i [x],k); } Złoono czasowa Liczba dostpów do stron na dysku w funkcji B_tree_search wynosi Θ ( h) = Θ( logt n), gdzie h jest wysokoci drzewa, a n liczb zapisanych w nim kluczy. 6. Tworzenie pustego B-drzewa Wstawienie pierwszego klucza do B - drzewa jest poprzedzone utworzeniem pustego wzła, który bdzie korzeniem drzewa (adres root). B_tree_Create (root) przydziel pam dla root ; leaf[root]=1; n[root]=0; Disk_Write(root); 11
Koszt czasowy operacji tworzenia pustego B-drzewa jest O(1) ze wzgldu na liczb dostpów dyskowych. 7. Rozbijanie wzła w B-drzewie Kluczowym elementem algorytmu wstawiania do B - drzewa jest rozbijanie "pełnego" wzła y na dwa wzły o t-1 kluczach. Wzeł y jest rozbijany wzgldem rodkowego klucza key t [y], który jest przesuwany do ojca wzła y. Załómy tymczasowo, e ojciec wzła y nie jest "pełny". Jeeli wzeł y jest korzeniem drzewa (nie ma ojca), to wysoko drzewa po rozbiciu ronie o 1. x - "niepełny" wzeł wewntrzny, znajdujcy si w pamici wewntrznej, i - indeks z zakresu 1..n[x]+1, y - "pełny" wzeł taki, e y = c i [x]. Procedura B_tree_Split_Child rozbija y na dwa wzły i zmienia x tak, aby był uwzgldniony jego nowy syn. B_tree_Split_Child(x, i, y) przydziel adres nowemu wzłowi z ; leaf[z]=leaf[y]; n[z]=t-1; for (j=1; j<=t-1; j++) key j [z]= key j+t [y]; if (!leaf[y]) for (j=1; j<=t; j++) c j [z]= c j+t [y]; n[y]=t-1; for (j=n[x]+1;j>=i+1;j--) c j+1 [x]= c j [x]; c i+1 [x]= z; for (j=n[x]; j>=i; j--) do key j+1 [x]= key j [x]; key i [x]= key t [y]; n[x]=n[x]+1; Disk_Write(y); Disk_Write(z); Disk_Write(x); 12
x Przykład... N, W... key i-1 [x] key i [x] x key i+1 [x] key i [x] key i-1 [x]... N, S, W... y=c i [x] P Q R S T U V y=c i [x] P Q R z=c i+1 [x] T U V Rozbijanie wzła z t = 4. Wzeł y jest rozbijany na dwa wzły: y oraz z, rodkowy klucz S z y zostaje przesunity do ojca y. root H s A D F H L N P r r A D F L N P Rozbijanie korzenia z t = 4. Korze r jest rozbijany na dwa wzły i jest tworzony nowy korze s. Nowy korze zawiera rodkowy klucz z r, a oba wzły powstałe z rozbicia zostaj jego synami. Rozbicie korzenia powoduje zwikszenie wysokoci drzewa o 1. 13
Koszt czasowy realizacji procedury B_tree_Split_Child jest równie O(1). 8. Wstawianie klucza do B drzewa root korze drzewa, k- wstawiany element B_tree_Insert(root, k) r=root; if (n[r]==2t-1) { przydziel pami wzłowi s ; root=s; leaf[s]=0; n[s]=0; c 1 [s]=r; B_tree_Split_Child(s, 1, r); B_tree_Insert_NoFull(s, k); } else B_tree_Insert_NoFull(r, k); B_tree_Insert_NoFull(x, k); i=n[x]; if (leaf[x]) { while (i>=1 && k<key i [x]) do { key i+1 [x]= key i [x]; i=i--; } key i+1 [x]=k; n[x]=n[x]+1; Disk_Write(x); } else { while (i>=1 && (k<key i [x]) i--; i++; 14
} Disk_Read(c i [x]); if (n[c i [x]]=2t-1) { B_tree_Split_Child(x, i, c i [x]); if (k> key i [x]) i++; } B_tree_Insert_NoFull(c i [x], k); Przykład (t = 3) a) pocztkowe drzewo G M P X A C D E J K N 0 R S T U V Y Z b) po wstawieniu B G M P X A BC D E J K N 0 R S T U V Y Z c) po wstawieniu Q G M P T X A BC D E J K N 0 Q R S U V Y Z d) po wstawieniu L P G M T X A BC D E J K L N 0 Q R S U V Y Z 15
e) po wstawieniu F P C G M T X A B D E F J K L N 0 Q R S U V Y Z Koszt pesymistyczny operacji wstawiania do B - drzewa jest rzdu wysokoci drzewa O(h)=O(log t n). Jak czsto mona si spodziewa koniecznoci rozdzielania wzłów? Rozdzielanie korzenia B-drzewa powoduje powstanie dwóch nowych wzłów. We wszystkich pozostałych przypadkach rozdzielanie zwiksza liczb wzłów w B - drzewie tylko o 1. Podczas konstruowania B - drzewa o p - wzłach rozdzielenie wzła trzeba wykona p - h razy, gdzie h jest wysokoci B - drzewa. W B - drzewie o p wzłach i minimalnym stopniu t jest co najmniej 1+ ( t 1)( p 1) kluczy. Proporcja liczby rozdziele do liczby kluczy w B - drzewie dana jest zatem wzorem: p h 1+ ( t 1)( p 1) Po podzieleniu licznika i mianownika przez p-h i obserwacji, e 1 p h dy do 0, a p 1 p h dy do 1 ze wzrostem p, wnioskujemy, e rednie prawdopodobiestwo rozdzielania 1 wynosi: t 1. Na przykład, gdy t = 5 prawdopodobiestwo to jest równe 0,25, ale dla t=500 wynosi tylko 0,002. Jest to zgodnie z oczekiwaniem; im wiksza pojemno jednego wzła, tym rzadziej trzeba wzły rozdziela. 16
9. Usuwanie klucza z B drzewa Załómy, e chcemy usun klucz k z poddrzewa o korzeniu w wle x. Zakładamy równie, e gdy z korzenia x zostaj usunite wszystkie klucze i x jest wzłem wewntrznym, to jest on wtedy usuwany, a jego jedyny syn c i [x] zostaje nowym korzeniem drzewa. W ten sposób wysoko drzewa jest zmniejszana o jeden, a własno, e korze drzewa zawiera co najmniej jeden klucz, jest zachowana (chyba, e drzewo jest puste). Opis algorytmu usuwania klucza z B - drzewa 1. Jeli klucz k jest w wle x i x jest liciem, to usu klucz k z x. 2. Jeli klucz k jest w wle x i x jest wzłem wewntrznym, to wykonaj: a) Niech y bdzie synem x poprzedzajcym k. Jeli y ma co najmniej t kluczy, to w poddrzewie o korzeniu y wyznacz poprzednik k ' klucza k. Rekurencyjnie usu k ' i w wle x zastp k przez k '. b) Symetrycznie, jeli syn z, który wystpuje po k w wle x, ma co najmniej t kluczy, to wyznacz nastpnik k ' dla k w poddrzewie o korzeniu w z. Rekurencyjnie usu k ' i zastp k przez k ' w x. c) Jeli obaj synowie y i z maj tylko po t-1 kluczy, to przenie k i wszystko z wzła z do y. W wyniku tej operacji klucz k i wskanik do z zostaj usunite z x. Nastpnie zwolnij pami przydzielon dla z i usu rekurencyjnie k z y. 3. Jeeli klucz k nie wystpuje w wewntrznym wle x, to wyznacz korze c i [x] poddrzewa, w którym musi znajdowa si k (jeli tylko jest w drzewie). Jeli c i [x] ma tylko t-1 kluczy, to wykonaj krok 3a) lub 3b) w celu zagwarantowania, e zejcie rekurencyjne nastpuje do 17
wzła zawierajcego co najmniej t kluczy. Nastpnie usu rekurencyjnie k z właciwego poddrzewa. a) Jeli w wle c i [x] jest tylko t-1 kluczy, ale jeden z jego ssiednich braci ma t kluczy, to umie w c i [x] dodatkowy klucz, przesuwajc odpowiedni klucz z x, a w jego miejsce przenoszc klucz z lewego lub prawego brata - z tego, który zawiera t kluczy. Na koniec przesu jeszcze z wybranego brata do c i [x] wskanik do odpowiedniego syna. b) Jeli c i [x] i ssiedni bracia maj po t-1 kluczy, to połcz c i [x] z jednym z ssiednich braci, przesuwajc odpowiedni klucz z x do nowo powstałego wzła. Przesunity klucz jest kluczem rodkowym w nowym wle. Poniewa wikszo kluczy w B - drzewie znajduje si w liciach, moemy oczekiwa, e włanie te klucze s usuwane najczciej. W tym przypadku usuwanie jest wykonywane w jednym przejciu od korzenia do licia. Jeli jest usuwany klucz z wzła wewntrznego, to oprócz przejcia "w dół" drzewa moe by jeszcze konieczny powrót do wzła, którego klucz jest usuwany, w celu zastpienia go przez poprzednik lub nastpnik w drzewie. Złoono czasowa operacji usuwania klucza z B - drzewa jest taka sama (zarówno pesymistyczna jak i rednia) operacji wstawiania. 18
Przykład (t = 3) a) Pocztkowe drzewo P C G M T X A B D E F J K L N O Q R S X b) Po usuniciu F: przypadek 1 U V Y Z P C G M T X A B D E J K L N O Q R S X c) Po usuniciu M: przypadek 2a U V Y Z P C G L T X A B D E J K N O Q R S X d) Po usuniciu G: przypadek 2c U V Y Z P C L T X A B D E J K N O Q R S X U V Y Z 19
e) Po usuniciu D: przypadek 3b C L P T X A B E J K N O Q R S X U V Y Z f) Po usuniciu N: przypadek 3a C L Q T X A B E J K O P R S U V Y Z Z definicji B - drzewa wynika, e s one wypełnione w co najmniej 50%. Moe si wic zdarzy, e 50% miejsca si w nich "marnuje". Analiza i symulacje wykazuj jednak, e po duej liczbie losowych wstawie i usuni B - drzewo jest wypełnione w około 69%, a póniejsze zmiany w proporcji zajtego miejsca s ju bardzo niewielkie. To, e B - drzewo bdzie wypełnione całkowicie, jest równie mało prawdopodobne, celowe wic wydaje si przyjcie dodatkowych warunków. 20
10. B * - drzewa B * - drzewo jest odmian B - drzewa wprowadzon przez Donalda Knutha, a nazwan tak przez Douglasa Comera. W B * - drzewie wszystkie wzły z wyjtkiem korzenia musz by wypełnione przynajmniej w dwóch trzecich, a nie tylko w połowie, jak w zwykłym B - drzewie. Dokładniej, liczba kluczy k, w nie bdcym korzeniem wle B * - drzewa, o minimalnym stopniu t spełnia warunek: 4t 2 2 1 3 k t Czsto rozdzielania wzłów zmniejszamy, opóniajc operacj rozdzielania, a w odpowiednim momencie rozdzielajc dwa wzły na trzy zamiast jednego na dwa. Operacj rozdzielenia opónia si, próbujc przemieszcza klucze midzy wzłem, a jego bratem, kiedy wzeł jest pełny. 21
Przykład (t = 4) a) Drzewo pocztkowe K A B C F G H I M O R S T W Y b)po wstawieniu E G O A B C E H I K M R S T W Y Zwrómy uwag, e równo zostały podzielone nie tylko klucze, ale i wolne miejsca, dziki czemu wzeł, który jest pełny, moe teraz pomieci jeszcze jeden klucz. Jeli brat pełnego wzła jest take pełny, to trzeba wykona operacj rozdzielania: tworzy si jeden nowy wzeł, klucze z wzła i jego brata (wraz z rozdzielajcym je kluczem z ojca) s równo dzielone midzy trzy wzły, a dwa oddzielajce je klucze s umieszczane w ojcu. Wszystkie trzy wzły biorce udział w operacji rozdzielania pozostaj wypełnione przynajmniej w dwóch trzecich. 22
11. B + - drzewa Jak zrealizowa w klasycznym B - drzewie algorytm wypisania wszystkich kluczy w porzdku rosncym? Mona by uy łatwej do zaimplementowania metody inorder, ale dla wszystkich wzłów wewntrznych byłby wypisywany jednorazowo tylko jeden klucz naraz, a potem nastpny krok wymagałby wczytania innego bloku. W B - drzewie odwołania do danych wystpuj w kadym wle drzewa, natomiast w B + - drzewie - jedynie w liciach. Wewntrzne wzły B + - drzewa słu jako indeksy umoliwiajce szybki dostp do danych; ta cz drzewa jest nazywana zbiorem indeksowym. Licie s zazwyczaj połczone w list. Przegldanie tej listy daje sekwencyjny dostp do danych. Wstawianie klucza do licia, w którym jest jeszcze wolne miejsce, wymaga ustawienia kluczy w tym liciu we właciwej kolejnoci. Nie zmienia si przy tym zbiór indeksowy. Jeli klucz jest wstawiany do pełnego licia, to li ten jest rozdzielany, nowy li jest włczany do listy, klucze s rozdzielane równomiernie midzy stary i nowy li, a pierwszy klucz z nowego wzła jest kopiowany (a nie przemieszczany, jak w B - drzewie) do ojca jako separator pomidzy tymi limi. Jeli ojciec nie jest pełny, moe to wymaga lokalnej reorganizacji kluczy w tym wle. Nowy li jest tworzony i włczany do listy, klucze s rozdzielane midzy te dwa licie, a nowy separator zostaje skopiowany z nowego licia do ojca. Jeli ojciec jest pełny, to proces rozdzielania postpuje jak w zwykłym B - drzewie - zbiór indeksowy jest przecie B - drzewem. 23
Przykład (t = 3) a) Drzewo pocztkowe P G K... A B D E F G H I K O b) Po wstawieniu C P D G K... A B C D E F G H I K O Usunicie klucza z licia, jeli nie powoduje wystpienia niedoboru, ogranicza si do poprawienia ustawienia pozostałych kluczy w kolejnoci, bez zmian w zbiorze indeksowym. W szczególnoci, jeli trzeba skasowa klucz wystpujcy nie tylko w liciu, to po prostu usuwa si go z licia, ale pozostawia w wle wewntrznym. Powodem takiego postpowania jest to, e klucz ten nadal pomaga znale właciw ciek podczas wdrówki w dół B + - drzewa, poniewa wci poprawnie separuje klucze dwóch ssiednich synów swojego wzła, chocia sam separator nie wystpuje w adnym z tych dwóch poddrzew. 24
Przykład a) Drzewo pocztkowe P C F K... A B C D F H I K O b) Po usuniciu B P F K... A C D F H I K O Jeli usunicie klucza z licia powoduje niedobór, to albo klucze z tego licia i jego brata s równo rozdzielane midzy te dwa wzły, albo li zostaje usunity, a jego pozostałe klucze s przenoszone do jego brata. Powyszy rysunek ilustruje ten ostatni przypadek. Po usuniciu B pojawia si niedobór i dwa licie s łczone w jeden. Pierwszy klucz prawego ssiada wzła powstajcego po połczeniu jest kopiowany do ojca, a klucze w ojcu s porzdkowane. Obydwie te operacje wymagaj uaktualnienia mieszczcego si w ojcu klucza separujcego dwa licie. Usunicie licia moe te wywoła seri złcze wzłów w zbiorze indeksowym. 25