• Nie Znaleziono Wyników

Algorytmy i Struktury Danych, 7. ¢wiczenia

N/A
N/A
Protected

Academic year: 2021

Share "Algorytmy i Struktury Danych, 7. ¢wiczenia"

Copied!
3
0
0

Pełen tekst

(1)

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

(2)

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

(3)

• 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

Cytaty

Powiązane dokumenty

Powiemy, że algorytm Alg działający w strukturze danych S jest całkowicie poprawny ze względu na specyfikację &lt;wp,wk&gt; wttw dla wszystkich danych w strukturze S

Problem Dany jest ciąg rosnący e[1],..,e[n] oraz element x pewnej przestrzeni liniowo uporządkowanej &lt;E, &gt;. Następnie porównujemy x z kolejnymi elementami ciągu

(3) Jeżeli tak otrzymane drzewo nie jest częściowo uporządkowane, to przechodząc wzdłuż drogi od liścia x do korzenia, poprawić etykiety zamieniając etykietę ojca z

takie drzewo &lt;V, T&gt; rozpinające grafu G, że suma kosztów jego krawędzi  eT c (e) jest najmniejsza.. Mirkowska, ASD_12 Algorytmy na

Powiemy, że problem jest rozstrzygalny, jeśli istnieje algorytm, który dla dowolnych danych x po skończonej liczbie kroków daje rozwiązanie problemu. W przeciwnym

Dodatkowo ka»dy w¦zeª ma dodatkowy atrybut suma oznaczaj¡cy sum¦ warto±ci z

[r]

Jeden z tych grafów zawiera mniej zªych kraw¦dzi (takich które powstaªy z M), dokªadniej zawiera co najwy»ej nβ/4 &lt; nk/4 zªych kraw¦dzi.. Po t krokach znajdziemy skojarzenie w