Algorytmy i Struktury Danych, 7. ¢wiczenia
2008-11-24
1 Plan zaj¦¢
• Ukryte sªowniki (search, insert, delete w czasie√
n; alternatywnie wyszu- kiwanie w O(log n) wstawianie, usuwanie O(√
n ∗ log n))
• 2-3 drzewa, dodatkowe operacje join i split.
• Pokaza¢, »e przy pomocy rotacji mo»na zawsze przej±¢ z jednego BST do drugiego.
2 Ukryty sªownik
(BKR) Cyklicznym blokiem nazywamy dowoln¡ tablic¦ S[i, . . . , j], której warto-
±ci speªniaj¡ nast¦puj¡cy warunek:
istnieje indeks k, i ≤ k ≤ j, taki, »e:
S[k] < S[k + 1] < . . . < S[j] < S[i] < . . . < S[k − 1]
Tablic¦ S[1..n] o warto±ciach ze zbioru L nazywamy tablic¡ cyklicznych bloków, je±li speªnione s¡ nast¦puj¡ce dwa warunki:
• ka»dy blok jest cyklicznym blokiem,
• wszystkie elementy bloku i − 1 s¡ mniejsze ni» wszystkie elementy bloku idla 2 ≤ i ≤ h, gdzie h jest maksymalnym numerem bloku.
Wyka», »e u»ywaj¡c struktury danych tablic cyklicznych bloków operacje accessmo»na wykona¢ za pomoc¡ 2 log n porówna«, a operacje insert i delete za pomoc¡ O(√
n log n)instrukcji (n oznacza liczb¦ elementów w zbiorze S).
• organizujemy tak, tablic¦, »eby ity blok miaª dªugo±¢ i (ewentualnie oprócz ostatniego).
• access wyszukaj binarnie odpowiedni blok, w bloku wyszukujemy prze- suniecie k, i binarnie wyszukujemy wewn¡trz bloku,
• insert wyszukaj odpowiedni blok (log n), je±li to nie jest ostatni blok, to trzeba zrobi¢ miejsce na nowy elementy wyrzucaj¡c najwi¦kszy, naj- wi¦kszy element trzeba przesun¡¢ do nast¦pnego bloku (√
n), z którego wypada kolejny element, itd. (√
nrazy, poniewa» nie trzeba ju» nic prze- suwa¢ jedna faza kosztuje log n).
• delete podobnie.
1
3 2-3 drzewa
2-3 drzewa to drzewa zrównowa»one o nast¦puj¡cych wªasno±ciach:
• ka»dy w¦zeª przechowuje 1 lub 2 klucze,
• ka»dy w¦zeª wewn¦trzny (oprócz korzenia) ma 2 lub 3 synów,
• wszystkie li±cie maj¡ t¡ sam¡ gª¦boko±¢,
• zachowany jest porz¡dek kluczy w poddrzewach (mniej wi¦cej jak w drze- wach BST),
Wstawienia do drzewa:
• znajdujemy li±¢ w którym powinien znale¹¢ si¦ nowy klucz, dodajemy go do w¦zªa,
• mo»e si¦ okaza¢, »e w¦zeª posiada chwilowo 3 klucze, w takim wypadku dzielimy go na dwie cz¦±ci (w ka»dej z nich zostawiamy jeden klucz) a trzeci klucz przekazujemy poziom wy»ej,
• tak dªugo jak drzewo zawiera w¦zeª z 3 kluczami powtarzamy t¡ procedur¦.
Usuwanie z drzewa:
• je±li klucz le»y w w¦¹le wewn¦trznym, to zamieniamy go z nast¦pnikiem (lub poprzednikiem), i redukujemy problem do usuwania z li±cia,
• je±li klucz le»y w li±ciu, to usuwamy go z w¦zªa,
• je±li okazuje si¦, »e jaki± w¦zeª zawiera 0 kluczy, to poprawiamy drzewo id¡c od tego w¦zªa do korzenia i próbuj¡c zast¡pi¢ puste miejsce kluczem po»yczonym od s¡siadów,
Scalanie (zakªadamy, »e klucze s¡ przetrzymywane w w¦zªach):
• dane s¡ drzewa T1, T2,
• usuwamy z T2najmniejszy klucz x,
• znajdujemy w T2w¦zeª v którego poddrzewo ma wysoko±¢ |T2|,
• dodajemy do v klucz x z prawym poddrzewem T2,
• je±li v zawiera 3 klucze, to poprawiamy warunku 2-3 drzewa id¡c od v do korzenia.
Zªo»ono±¢ O(log(|T1| + |T2|)).
Scalanie (zakªadamy, »e klucze s¡ przetrzymywane w li±ciach):
• je±li h1 = h2, to tworzymy trzewo T z warto±ci¡ w¦zªa max(T1.root), lewym poddrzewem T1, prawym poddrzewem T2,
• je±li h1 > h2, to znajdujemy na skrajnie prawej ±cie»ce T1, w¦zeª v o wysoko±ci h2+ 1, dodajemy do v now¡ warto±¢ z w¦zªa min(T2.root) i podª¡czamy T2jako skrajnie prawe poddrzewo, je±li w wyniku tej operacji w¦zeª v ma 3 warto±ci, to poprawiamy drzewo id¡¢ od v do korzenia,
2
• je±li h1 < h2, to post¦pujemy analogicznie jak w poprzednim przypadku (ale dodajemy T1 do T2 i szukamy w¦zªa na skrajnie lewej ±cie»ce).
Zªo»ono±¢ O(1 + |h1− h2|) = O(log(|T1| + |T2|)).
Split (zakªadamy, »e klucze s¡ przetrzymywane w li±ciach) podziaª drzewa T na dwa poddrzewa T1 (z kluczamy ≤ x) i T2 (z kluczamy > x):
• szukamy ±cie»ki od korzenia do li±cia w którym nale»aªoby wstawi¢ klucz x, w¦zªy na tej ±cie»ce oznaczamy przez v0= root, v1, . . . , vk,
• likwidujemy w¦zªy v0, . . . , vk−1, a w¦zeª vkrozbijamy na dwa w¦zªy (jeden z warto±ciami ≤ x, drugi z warto±ciami > x),
• drzewo rozpada si¦ na dwa lasy F≤ (drzewa z warto±ciami ≤ x), i F>
(drzewa z warto±ciami > x),
• scalamy drzewa F≤ wg. rosn¡cych wysoko±ci otrzymuj¡c T1,
• scalamy drzewa F> wg. rosn¡cych wysoko±ci otrzymuj¡c T2,
4 Pokaza¢, »e przy pomocy rotacji mo»na zawsze przej±¢ z jednego BST do drugiego
Za pomoc¡ rotacji mo»emy dowolne drzewo BST zamieni¢ na list¦ (i na odwrót).
Wstarczy tak dªugo jak drzewo zawiera w¦zeª z lewym synem, wykonujemy na nim (i lewym synie) praw¡ rotacj¦.
3