• Nie Znaleziono Wyników

Projektowanie struktur danych

Niniejsze zajęcia poświęcone są projektowaniu struktur słownikowych, które przy podanych założeniach czasowych wykonują zadane dodatkowe operacje.

Struktury takie stanowić będą rozszerzenia drzew AVL.

Rozważmy następujący przykład.

Przykład 12.1 Zaprojektować strukturę danych umożliwiającą wykonanie w czasie Θ(n lg n) następujących operacji na n–elementowym zbiorze A ⊆ U , gdzie (U,6), zaś 6 jest porządkiem liniowym:

1. Insert (A, x) : A := A ∪ {x}

2. Delete(A, x) : A := A \ {x}

3. Member (A, x) : czy x ∈ A?

4. Select (A, k) : wyznacz k–ty co do wielkości element w A

5. Number (A, k) : którym co do wielkości elementem w A jest x (o ile x ∈ A, wpp funkcja zwraca 0).

Rozwiązanie

Wykorzystujemy drzewo AVL, w każdym węźle którego zapisujemy:

• key – klucz elementu

• aspect – współczynnik wyważenia

• left, right – wskaźnik do lewego i prawego następnika

• numR – liczba węzłów w prawym poddrzewie.

Operacje Insert i Delete działają jak w drzewie AVL z tym, że odpowiednio modyfikujemy atrubut numR w węźle, jeśli wysokość prawego poddrzewa zmieniła się.

69

Operacja Number :

1. Rozważamy węzeł t (początkowo t jest korzeniem drzewa), zmienna licz podaje aktualnie znalezioną liczbę węzłów w drzewie o kluczach większych od x (początkowo licz = 0).

2. Jeśli klucz węzła t jest równy x, to zwracamy liczbę licz powiększoną o 1 (węzeł t) oraz liczbę węzłów większych od klucza t i KONIEC.

3. Jeśli klucz w t jest mniejszy od x, to przechodzimy do lewego poddrze-wa (sukamy k–tego co do wielkości w prawym poddrzewie).

4. Jeśi klucz węzła t jest mniejszy od x, to przechodzimy do lewego pod-drzewa, przy czym liczbę węzłów o kluczach większych od x zwiększa-my o 1 (węzeł t) oraz liczbę węzłów w prawym poddrzewie t.

5. Proces kontunuujemy dopóki znajdziemy element x (wtedy zwracamy liczbę węzłów większych od x plus 1) bądź dojdziemy do węzła ze-wnętrznego NULL (oznacza to, że klucza x nie ma w drzewie – wtedy zwracamy 0).

Algorytm: Procedura Number 1 Number (t : tree; x : U ) : int;

2 var licz : int;

3 begin 4 licz := 0;

5 while t 6= N U LL do

6 if t ↑.key = x then return(licz + 1 + t ↑.numR) fi;

7 if t ↑.key < x 8 then t := t ↑.right

9 else licz := licz + 1 + t ↑.numR; t := t ↑.left fi

10 od;

11 return(0);

12 end Number ; Operacja Select :

1. Rozważamy węzeł t drzewa (początkowo jest to korzeń drzewa).

2. Jeśli liczba węzłów w prawym poddrzewie węzła t jest równa k − 1, to zwracamy klucz węzła t i KONIEC.

12.1. ZADANIA 71 3. Jeśli liczba węzłów w prawym poddrzewie węzła t jest większa od k −1,

to przechodzimy do prawego poddrzewa.

4. Jeśli liczba węzłów w prawym poddrzewie jest mniejsza od k − 1, to szukamy k − numR − 1–elementu w lewym poddrzewie .

5. Poszukiwania kontynuujemy dopóki znajdziemy element (wtedy zwra-camy ten element) bądź dojdziemy do węzła zewnętrznego NULL (wte-dy zwracamy pustą daną NullData – onacza to, że poszukiwaliśmy k–tego elementu, gdzie k > n).

Algorytm: Procedura Select 1 Select (t : tree; k : int) : U ;

2 begin

3 while t 6= N U LL do

4 if t ↑.numR + 1 = k then return(t ↑.key) fi;

5 if t ↑.numR + 1 > k 6 then t := t ↑.right

7 else k := k − t ↑.numR − 1; t := t ↑.left; fi;

8 od;

9 return(NullData);

10 end Number ;

12.1 Zadania

1. W Przykładzie 12.1 operacje Insert i Delete mogą wymagać modyfika-cji atrybutu numR w węzłach. Uzasadnić, że te żłożoność tych procedur jest Θ(lg n).

2. Dany jest zbiór uporządkowany (U, ≤), gdzie ≤ jest porządkiem linio-wym. Opracować strukturę danych, która w czasie Θ(log n) gwarantuje wykonanie następujących operacji na n–elementowym zbiorze A ⊆ U :

(a) Insert (A,x) ::= A := A ∪ {x}

(b) Member (A,x) ::= czy x ∈ A?

(c) Between(A,x,y) ::= |{a ∈ A : x6 a 6 y}|

Dokładnie omówić poszczególne procedury i uzasadnić ich złożoność.

3. Dana jest struktura (U, ≤, ⊕), gdzie U nie niepustym zbiorem, ⊕ jest 2–argumentową operacją w U , przemienną i łączną o elemencie neu-tralnym e, zaś ≤ jest relacją porządku liniowego. Opracować strukturę danych gwarantujacą wykonanie w czasie Θ(log n) następujących ope-racji na n–elementowym zbiorze A ⊆ U :

(a) Insert (A, x) ::= A := A ∪ {x}

(b) Delete(A, x) ::= A := A \ {x}

(c) Member (A, x) ::= czy x ∈ A?

(d) Summarize(A, x) ::= wyznacz sumę elementów ze zbioru A nie większych od x, tzn. Summrize(A, x) =L{a ∈ A : a ≤ x}.

Opisać dokładnie te operacje i uzasadnić ich złożoność czasową.

4. Dana jest struktura (U, ≤, ⊕), gdzie U nie niepustym zbiorem, ⊕ jest 2–argumentową operacją sumowania w U , przemienną i łączną o ele-mencie neutralnym e, zaś ≤ jest relacją porządku liniowego. Opracować strukturę danych gwarantujacą wykonanie w czasie Θ(log n) następują-cych operacji na n–elementowym ciągu A = (a1, . . . , an) o elementach ze zbioru U :

(a) Put (A, k, x) : Ak := x (wstaw x na k–tą pozycję ciągu, 1 ≤ k ≤ n+1)

(b) Search(A, k) : podaj k–ty element ciągu (c) Sum(A, k) : wyznacz Pn

i=kai.

Omówić dokładnie działanie tych operacji i uzasadnić ich złożoność czasową.

5. Dany jest system (U, ≤), gdzie U jest niepustym zbiorem, zaś ≤ jest relacją liniowego porządku w U . Opracować strukturę danych gwa-rantująca wykonanie w czasie Θ(log n) następujących operacji na n–

elementowym zbiorze A przedziałów [a, b], a ≤ b, a, b ∈ U : (a) Insert (A, a, b) : A := A ∪ {[a, b]}

(b) Delete(A, a, b) : A := \{[a, b]}

(c) Belongs(A, x) : czy x należy do jakiegoś przedziału ze zbiory A?

(d) Intersection(A, a, b) : czy w A isnieje przedział [x, y] mający nie-puste przecięcie z przedziałem [a, b]?

Omówić dokładnie te operacje i uzasadnić ich złożoność czasową.

Ćwiczenia 13

Podsumowanie

Niniejsze zajęcia poświęcone są podsumowaniu zagadnień omawianych trak-cie kursu. W szczególności omawiane są przykładowe zestawy egzaminacyj-nych pytań i zadań testowych.

Przykład 13.1 Dany jest n–elementowy kopiec zupełny reprezentowany w n–elementowej tablicy K. Określić ile elementów można dodać do tego kopca, aby nie zmienić jego wysokości.

Rozwiązanie:

Kopca o n węzłach ma wysokość h = dlg n + 1e. Na ostatnim, h–tym poziomie jest maksymalnie 2dlg n+1e węzłów. Kopiec o wysokości h ma maksymalnie 2h−1 węzłów. Zatem ilość węzłów brakujących do wypełnienia ostatniego poziomu to l = 2dlg n+1e−n−1.

Przykład 13.2 Znajdź rozwiązanie równania rekurencyjnego postaci:

T (n) =

F1= bn

Szereg s(x) jest zbieżny, więc można go całkować wyraz po wyrazie.

Z

13.1 Przykładowe zestawy zadań testowych

1. Wskazać poprawny ciąg odpowiadający ścieżce poszukiwań elementu x = 10 w drzewie BST:

13.1. PRZYKŁADOWE ZESTAWY ZADAŃ TESTOWYCH 75



(20, 4, 15, 6, 10)



(18, 5, 25, 1, 10)



(16, 3, 12, 14, 10)



(7, 15, 8, 9, 10) .

2. Dany jest losowy ciąg n–elementowy, n ≥ 50, o elementach z dziedziny U , gdzie (U, 6), zaś 6 jest liniowym porządkiem. W celu efektywnego posortowania tego ciągu w porządku niemalejącym należy zastosować algorytm:



sortowania kubełkowego



sortowania szybkiego



sortowania bąbelkowego



sortowania przez kopcowanie.

3. Ile co najwyżej razy może zostać przestawiony element maksymalny ciągu, gdy ciąg jest porządkowany algorytmem sortowania przez wsta-wianie InsertionSort :



n razy



dn2e razy



dlg ne razy



n2 razy.

4. Dany jest ciąg (8, 5, 4, 3, 2, 1) reprezentujący kopiec. Wynikiem wsta-wienia elementu x = 7 do tego kopca będzie kopiec reprezentowany przez ciąg



(8, 7, 5, 3, 2, 1, 4)



(8, 7, 5, 2, 1, 4, 3)



(8, 5, 7, 3, 2, 1, 4)



(8, 5, 7, 1, 4, 2, 3).

5. Wskazać cechy charakteryzujace B–drzewo rzędu k:



jest to drzewo binarne



w każdym węźle (poza korzeniem) zapisanych jest m kluczy, k6 m 6 2k



w liściach jest dokładnie k kluczy



wszystkie liście są na jednym poziomie.

6. Dane jest drzewo AVL. Wstawienie elementu x do tego drzewa może wymagać wykonania



1 rotacji



lg n rotacji



dn2e rotacji



0 rotacji.

7. Dane są 2 algorytmy, Alfa i Beta, rozwiązujące ten sam problem. Al-gorytm Alfa ma czasową złożoność obliczeniową Θ(n2), zaś algorytm Beta Θ(n lg n). Czy prawdą jest, że



algorytm Alfa jest zawsze wolniejszy niż algorytm Beta



średnia czasowa złożoność algorytmu Alfa może być lepsza niż średnia czasowa złożoność obliczeniowa algorytmu Beta



istnieją dane, dla których algorytm Alfa jest wolniejszy niż algo-rytm Beta



nie ma takich algorytmów.

8. Dany jest kopiec K o wysokości h = 5 i liczbie węzłów n. Jaka może być wartość n?



n = 5



n = 25



n = 31



n = 20.

Zadanie 9: Algorytm “magicznych piątek ” zachowa asymptotycznie liniową złożoność czasową, gdy



ciąg wejściowy podzielimy na podciągi o długości dokładnie 5-ciu elementów



ciąg wejściowy podzielimy na podciągi o długości k, gdzie k = 5n, n ∈ N



ciąg wejściowy podzielimy na podciągi długości k> 5



długości podciągów, na które dzielimy ciąg wejściowy nie ma wpływu na złożoność czasową algorytmu, istotne jest tylko, by podciągi te miały stałą długość k.

9. Algorytm sortowania polegający na kolejnym wyznaczaniu elementu minimalnego spośród elementów jeszcze nie posortowanych to



sortowanie przez wstawianie

13.1. PRZYKŁADOWE ZESTAWY ZADAŃ TESTOWYCH 77



sortowanie przez wybór



sortowanie bąbelkowe



sortowanie kubełkowe.

10. Dany jest algorytm postaci:

1 Alpha(n:int);

2 var i, j : int;

3 begin

4 if n = 1 then exit fi;

5 Alpha(bn2c);

6 for i := bn2c+1 to n do

7 Beta(i)

8 od;

9 end; Alpha;

Wiadomo, że złożoność obliczeniowa procedury Beta dla danych n ∈ N to Θ(1). Zanalizować czasową złożoność obliczeniową procedury Alpha i dokładnie uzasadnić uzyskany wynik.

11. Dany jest następujący algorytm:

1 Alpha(n:int);

2 var i, j : int;

3 begin 4 i := 0;

5 while i < n do 6 i := i+1;

7 Omega(i);

8 j := b2ic;

9 while j > 0 do

10 Omega(j);

11 j := bn2c

12 od

13 od

14 end Alpha;

Wiadomo, że procedura Omega dla danych k ∈ N ma złożoność czaso-wą Θ(1). Zanalizować złożoność czasoczaso-wą procedury Alpha i dokładnie uzasadnić uzyskany wynik.

Literatura

[1] A. V. Aho, J. E. Hopcroft, J. D. Ullman. Projektowanie i analiza algo-rytmów, Wydawnictwo Helion, Gliwice, 2003.

[2] A. V. Aho, J. E. Hopcroft, J, D. Ullman. Algorytmy i struktury danych, Wydawnictwo Helion, Gliwice, 2003.

[3] L. Banachowski, A, Kreczmar. Elementy analizy algorytmów, Wydaw-nictwo Naukowo–Techniczne, Warszawa, 1982

[4] L. Banachowski, A. Kreczmar, W. Rytter. Analiza algorytmów i struktur danych, Wydawnictwo Naukowo–Techniczne, Warszawa, 1987.

[5] A. Dańko, T. L. Le, G. Mirkowska, P. Rembelski, A. Smyk, M. Sy-dow. Algorytmy i struktury Danych – Zadania, Wydawnictwo PJWSTK, Warszawa, 2006.

[6] L. Banachowski, K. Diks, W. Rytter. (1996). Algorytmy i struktury da-nych, Wydawnictwo Naukowo–Techniczne, Warszawa, 1996.

[7] T. H. Cormen, Ch. E. Leiserson, R. L. Rivest. Wprowadzenie do algoryt-mów i struktur danych, Wydawnictwo Naukowo–Techniczne, Warszawa, 1996.

[8] D. Harel. Rzecz o istocie informatyki, Algorytmika, Wydawnictwo Naukowo–Techniczne, Warszawa, 1992.

[9] D. Knuth. Sztuka programowania. Wydawnictwo Naukowo–Techniczne, Warszawa, 2002.

[10] R. Sedgewick. Algorytmy w C++, Oficyna Wydawnicza READ ME, Warszawa, 1999.

[11] P. Wróblewski. Algorytmy, struktury danych i techniki programowania, Wydawnictwo Helion, Gliwice, 2003

79

Powiązane dokumenty