Algorytmy i Struktury Danych, 8. ¢wiczenia
2008-12-01
1 Plan zaj¦¢
• zadania 3.24-3.29 z ksiazki z ASD
• drzewa przedzialowe z Cormena.
2 ASD Zadania wzbogacanie struktur danych
Zadanie 3.24
Zaprojektuj struktur¦ danych umo»liwiaj¡c¡ wykonywanie w czasie O(log n) nast¦puj¡cych operacji na zbiorze S:
• makeset(S):: S := ∅
• insert((x, y), S):: S := S ∪ {(x, y)}
• minx(S):: usuni¦cie z S pary (x, y) o najmniejszej pierwszej skªadowej,
• miny(S):: usuni¦cie z S pary (x, y) o najmniejszej drugiej skªadowej,
• searchx(x, S):: wyznaczenie takiej pary (a, b) ∈ S, »e x = a,
• searchy(y, S):: wyznaczenie takiej pary (a, b) ∈ S, »e y = b.
Rozwi¡zanie: dwa drzewa AVL (jedno ze wspóªrz¦dnymi x, drugie ze wspóª- rz¦dnymi y), dodatkowo ka»dy w¦zeª trzyma dowi¡zanie do odpowiadaj¡cego mu w¦zªa w drugim drzewie.
Zadanie 3.25
Zaprojektuj struktur¦ danych umo»liwiaj¡c¡ wykonywanie w czasie O(log n) nast¦puj¡cych operacji na zbiorze S:
• construct(S):: utworzenie ci¡gu pustego S,
• insert(S, x):: S := S ∪ {(x)},
• delete(S, x):: S := S − {(x)},
• search(S, x):: sprawdzenie, czy x znajduje si¦ w zbiorze S,
• elem(S, i):: wyznaczenie itego co do wielko±ci elementu zbioru S, 1
• numb(S, x) :: wyznaczenie numeru elementu x w zbiorze S (wzgl¦dem wielko±ci).
Rozwi¡zanie: drzewo AVL z atrybutami rozmiar poddrzewa.
Zadanie 3.26
Zaprojektuj struktur¦ danych do wykonywania ci¡gów nast¦puj¡cych operacji (dla elementów x pochodz¡cych z dowolnego zbioru liniowo uporz¡dkowanego):
• initialization:: Si= ∅dla i = 1, 2, . . . , n,
• insert(Si, x) :: Si := Si∪ {(x)}, pod warunkiem, »e x nie wyst¦puje w
»adnym zbiorze Sj, 1 ≤ j ≤ n,
• deletemin(Si):: usuni¦cie ze zbioru Si najmniejszego elementu,
• f ind(x):: wyznaczenie numeru zbioru do którego nale»y element x.
Rozwi¡zanie: Sijako zwykªe kopce, dodatków utrzymujemy sªownik par (x, numerzbioru)
Zadanie 3.27
Zaprojektuj struktur¦ danych umo»liwiaj¡c¡ wykonywanie w czasie O(log n) nast¦puj¡cych operacji na ci¡gu S:
• construct(S):: utworzenie ci¡gu pustego S,
• insert(S, i, x):: wstawienie x na i-te miejsce w ci¡gu S, tzn. Si= xpod warunkiem, »e i ≤ |S| + 1,
• sum(S, i, j):: obliczenie sumy Pjk=iSk,
Rozwi¡zanie: AVL z dodatkowym atrybutem suma elementów poddrzewa.
Zadanie 3.28
Rozwi¡zanie: AVL z atrybutem rozmiar poddrzewa.
Zadanie 3.29
Zaprojektuj struktur¦ danych umo»liwiaj¡c¡ wykonywanie w czasie O(log n) nast¦puj¡cych operacji na zbiorze S zawieraj¡cym przedziaªy liczb rzeczywistych [l, r]:
• empty(S):: S = ∅,
• add(S, I):: S = S ∪ {I},
• delete(S, I):: S = S − {I},
• is(S, x) :: sprawdzenie czy element x nale»y do jakiego± przedziaªu w zbioru S;
2
• intersect(S, I) :: sprawdzenie czy przedziaª I ma niepuste przeci¦cie z jakim± przedziaªem nale»¡cym do S.
Rozwi¡zanie: Utrzymujemy sªownik z parami (x, z) (gdzie x to liczba rzeczy- wista, a z +1 lub -1). Dodatkowo ka»dy w¦zeª ma dodatkowy atrybut suma oznaczaj¡cy sum¦ warto±ci z w poddrzewie. Mo»emy w takim drzewie w czasie O(log n) obliczy¢ sum(q) oznaczaj¡c¡ sum¦ wszystkich atrybutów z par (x, z), takich, »e x ≤ q.
• add(S, I) dodajemy do sªownika pary (l, +1) i (r, −1),
• delete(S, I) usuwamy ze sªownika pary (l, +1) i (r, −1),
• is(S, x) je±li sªownik zawiera pary (x, +1) lub (x, −1) to zwracamy true, wpp. obliczamy sum(x) i je±li suma jest > 0 to zwracamy true, je±li sum(x) ≤ 0, to zwracamy false.
• intersect(S, I), je±li is(S, l) lub is(S, r) to zwracamy true, je±li istnieje w sªowniu para (x, z), t.»e l ≤ x ≤ r, to zwracamy true, wpp zwracamy f alse.
3