ASD Ćwiczenia 10: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
(Nie pokazano 4 wersji utworzonych przez jednego użytkownika) | |||
Linia 7: | Linia 7: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Tworzymy n singletonów, a potem kolejno dla <math>i = 1, 2 \ldots n-1</math> dołączamy listę długości i za listę długości 1. | Tworzymy n singletonów, a potem kolejno dla <math>i = 1, 2 \ldots n-1</math> dołączamy listę długości <math>i</math> za listę długości 1. | ||
</div> | </div> | ||
</div> | </div> | ||
Linia 14: | Linia 14: | ||
Zadanie 2 | Zadanie 2 | ||
Udowodnij, że w implementacji listowej z heurystyką łączenia z wyważaniem koszt wykonania | Udowodnij, że w implementacji listowej z heurystyką łączenia z wyważaniem koszt wykonania <math>m</math> operacji MakeSet, Find i Union, spośród których <math>n</math> to MakeSet, wynosi <math>O(m+n\log n)</math>. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
Rozwiązanie | Rozwiązanie | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Przez indukcję dowodzimy, że długość listy zawierającej element, który miał k razy zmieniany wskaźnik do reprezentanta, wynosi co najmniej <math>2^k</math>. Wynika z tego, że każdy element może mieć zmieniany wskaźnik do reprezentanta co najwyżej <math>\log n</math> razy, | Przez indukcję dowodzimy, że długość listy zawierającej element, który miał <math>k</math> razy zmieniany wskaźnik do reprezentanta, wynosi co najmniej <math>2^k</math>. Wynika z tego, że każdy element może mieć zmieniany wskaźnik do reprezentanta co najwyżej <math>\log n</math> razy, koszt zamortyzowany operacji Union wynosi więc <math>O(\log n)</math>.</div> | ||
</div> | </div> | ||
Linia 25: | Linia 25: | ||
Zadanie 3 | Zadanie 3 | ||
Udowodnij, że w implementacji drzewiastej z łączeniem według wysokości wysokość drzewa zawierającego n węzłów jest mniejsza bądź równa <math>\lfloor\log n\rfloor</math>. | Udowodnij, że w implementacji drzewiastej z łączeniem według wysokości wysokość drzewa zawierającego <math>n</math> węzłów jest mniejsza bądź równa <math>\lfloor\log n\rfloor</math>. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
Rozwiązanie <div class="mw-collapsible-content" style="display:none"> | Rozwiązanie <div class="mw-collapsible-content" style="display:none"> | ||
Przez indukcję względem | Przez indukcję względem <math>h</math> dowodzimy, że drzewo o wysokości <math>h</math> musi zawierać co najmniej <math>2^h</math> węzłów. Wysokość drzewa wzrasta podczas operacji Union wtedy i tylko wtedy, gdy łączymy dwa drzewa takiej samej wysokości. | ||
</div></div> | </div></div> | ||
Linia 66: | Linia 66: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
Rozwiązanie <div class="mw-collapsible-content" style="display:none"> | Rozwiązanie <div class="mw-collapsible-content" style="display:none"> | ||
Zauważmy, że ''ranga'' węzła x w lesie zbiorów rozłącznych powstającym w wyniku ciągu <math>\sigma</math> operacji MakeSet, Union i Find jest równa ''wysokości'' poddrzewa x w lesie dla ciągu operacji <math>\sigma'</math> utworzonego z <math>\sigma</math> przez usunięcie wszystkich operacji Find. Stąd natychmiast wynikają punkty (a) i (b), bo wysokości poddrzew na ścieżce od dowolnego węzła do korzenia tworzą ciąg ściśle rosnący. Punkt (c) wynika z zadania 3, a (d) wynika z (c) (bo każdy węzeł może należeć do co najwyżej jednego poddrzewa o korzeniu rangi r).</div></div> | Zauważmy, że ''ranga'' węzła <math>x</math> w lesie zbiorów rozłącznych powstającym w wyniku ciągu <math>\sigma</math> operacji MakeSet, Union i Find jest równa ''wysokości'' poddrzewa <math>x</math> w lesie dla ciągu operacji <math>\sigma'</math> utworzonego z <math>\sigma</math> przez usunięcie wszystkich operacji Find. Stąd natychmiast wynikają punkty (a) i (b), bo wysokości poddrzew na ścieżce od dowolnego węzła do korzenia tworzą ciąg ściśle rosnący. Punkt (c) wynika z zadania 3, a (d) wynika z (c) (bo każdy węzeł może należeć do co najwyżej jednego poddrzewa o korzeniu rangi <math>r</math>).</div></div> | ||
Zadanie 6 | Zadanie 6 | ||
Udowodnij, że jeśli w implementacji drzewiastej z | Udowodnij, że jeśli w implementacji drzewiastej z łączeniem według rangi i kompresją ścieżki najpierw wykonujemy wszystkie operacje Union, a dopiero potem wszystkie operacje Find, to zamortyzowany koszt operacji Find jest stały. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
Linia 88: | Linia 88: | ||
for i := 1 to |V| do<br> | for i := 1 to |V| do<br> | ||
MakeSet(v_i);<br> | MakeSet(v_i);<br> | ||
T := | T := <math>\emptyset</math>;<br> | ||
for j := 1 to m do<br> | for j := 1 to m do<br> | ||
niech e_j = {v_i, v_k | niech <math>e_j = \{v_i, v_k\}</math>;<br> | ||
if Find(v_i) <> Find(v_k) then <br> | if Find(<math>v_i</math>) <> Find(<math>v_k</math>) then <br> | ||
T := T | T := T <math>\cup \{e_j\}</math>;<br> | ||
Union(Find(v_i),Find(v_k))<br> | Union(Find(<math>v_i</math>),Find(<math>v_k</math>))<br> | ||
Koszt tej implementacji jest zdominowany przez koszt sortowania: O(m\log m). | Koszt tej implementacji jest zdominowany przez koszt sortowania: <math>O(m\log m)</math>. | ||
</div></div> | </div></div> | ||
Aktualna wersja na dzień 12:28, 30 wrz 2006
Zadanie 1
Podaj przykład ciągu operacji MakeSet, Find i Union w implementacji listowej bez łączenia z wyważaniem, których łączny koszt to .
Rozwiązanie
Zadanie 2
Udowodnij, że w implementacji listowej z heurystyką łączenia z wyważaniem koszt wykonania operacji MakeSet, Find i Union, spośród których to MakeSet, wynosi .
Rozwiązanie
Zadanie 3
Udowodnij, że w implementacji drzewiastej z łączeniem według wysokości wysokość drzewa zawierającego węzłów jest mniejsza bądź równa .
Zadanie 4
Napisz pseudokod operacji MakeSet, Union i Find w implementacji drzewiastej z łączeniem według rangi i kompresją ścieżki.
Zadanie 5
Udowodnij Lemat 1.
Zadanie 6
Udowodnij, że jeśli w implementacji drzewiastej z łączeniem według rangi i kompresją ścieżki najpierw wykonujemy wszystkie operacje Union, a dopiero potem wszystkie operacje Find, to zamortyzowany koszt operacji Find jest stały.
Zadanie 7
Algorytm Kruskala znajdowania minimalnego drzewa rozpinającego w grafie z wagami na krawędziach działa następująco: krawędzie są przeglądane w kolejności od najlżejszej do najcięższej. Aktualnie rozważaną krawędź dodajemy do budowanego drzewa, o ile tylko nie powoduje to powstania cyklu. Jak efektywnie zaimplementować ten algorytm? Jaki jest jego czas działania?
Zadanie 8
Napisz program generujący labirynt następująca metodą: Na początku każda komnata jest otoczona ścianami. W każdym kroku wybieramy losowo ścianę i usuwamy ją, jeśli komnaty po jej obu stronach nie są jeszcze połączone żadną drogą.
Zadanie 9
Plansza do gry w Hex ma kształt rombu zbudowanego z sześciokątnych pól. Dwaj gracze wykonują na przemian ruchy polegające na dostawieniu pionka na jedno pole. Celem pierwszego gracza jest zbudowanie z białych pionków drogi łączącej lewy dolny brzeg planszy z prawym górnym, natomiast celem drugiego jest zbudowanie z czarnych pionków drogi łączącej lewy górny brzeg planszy z prawym dolnym.

Zaprojektuj algorytm, który po każdym ruchu sprawdza, czy nastąpiła wygrana któregoś z graczy.