ASD Ćwiczenia 10

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

Zadanie 1 Podaj przykład ciągu O(n) operacji MakeSet, Find i Union w implementacji listowej bez łączenia z wyważaniem, których łączny koszt to Θ(n2).

Rozwiązanie


Zadanie 2 Udowodnij, że w implementacji listowej z heurystyką łączenia z wyważaniem koszt wykonania $m$ operacji MakeSet, Find i Union, sposród których n to MakeSet, wynosi O(m+nlogn).

Rozwiązanie


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 logn.

Rozwiązanie


Zadanie 4 Napisz pseudokod operacji MakeSet, Union i Find w implementacji drzewiastej z łączeniem według rangi i kompresją ścieżki.

Rozwiązanie

Zadanie Udowodnij Lemat 1.

Rozwiązanie Zauważmy, że ranga węzła $x$ w lesie zbiorów rozłącznych powstającym w wyniku ciągu $\sigma$ operacji MakeSet, Union i Find jest równa wysokości poddrzewa $x$ w lesie dla ciągu operacji $\sigma'$ utworzonego z $\sigma$ 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$).

Zadanie Udowodnij, że jeśli w implementacji drzewiastej z lączeniem wedlug rangi i kompresją ściezki najpierw wykonujemy wszystkie operacje Union, a dopiero potem wszystkie operacje Find, to zamortyzowany koszt operacji Find jest stały.

Rozwiązanie Każdą krawędź drzewa utworzonego w wyniku ciągu operacji Union - z wyjątkiem krawędzi prowadzących do korzenia - przechodzimy tylko raz.

Zadanie Algorytm Kruskala znajdowania minimalnego drzewa rozpinającego w grafie $G = (V,E)$ 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?

Rozwiązanie Sortujemy krawędzie niemalejąco według wag: $e_1, \ldots, e_m$; for i := 1 to |V| do

MakeSet(v_i);

T := $\emtyset$; for j := 1 to m do

niech e_j = {v_i, v_k);
if Find(v_i) <> Find(v_k) then 
 T := T $\cup$ e_j;
 Union(Find(v_i),Find(v_k))

Koszt tej implementacji jest zdominowany przez koszt sortowania: O(m\log m).

Zadanie 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ą.

Rozwiązanie Do zarządzania relacją "komnaty są połączone pewną drogą" należy wykorzystać strukturę danych dla zbiorów rozłącznych.

Zadanie 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.

                            • rysunek ****************************

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

Rozwiązanie Planszę możemy interpretować jako graf, w którym wierzchołki odpowiadają polom, a krawędzie łączą te pola, które sąsiadują ze sobą. Warto dołożyć jeszcze po dwa sztuczne białe i czarne wierzchołki połączone krawędziami z polami z odpowiednich brzegów planszy. Po każdym ruchu algorytm powinien uaktualnić składowe, odpowiednio, w białej albo czarnej części grafu (Union) i sprawdzić, czy sztuczne, "brzegowe" wierzchołki znalazły się w jednej składowej (Find).