• Nie Znaleziono Wyników

Algorytmy 2 Laboratorium: algorytm Kruskala i struktura Union-Find

N/A
N/A
Protected

Academic year: 2021

Share "Algorytmy 2 Laboratorium: algorytm Kruskala i struktura Union-Find"

Copied!
4
0
0

Pełen tekst

(1)

Algorytmy 2

Laboratorium: algorytm Kruskala i struktura Union-Find

Przemysław Klęsk 1 grudnia 2019

1 Cel

Celem zadania jest wykonanie implementacji algorytmu Kruskala, który znajduje minimalne drzewo roz- pinające (MST — ang. minimum spanning tree) dla danego grafu nieskierowanego z wagami. Wagi są przypisane do krawędzi grafu i reprezentują koszty przejścia. Minimalne drzewo rozpinające to taki pod- zbiór krawędzi grafu, którego suma wag jest najmniejsza i jednocześnie w ramach tego podzbioru istnieje droga pomiędzy każdą parą węzłów grafu. Przykłady pokazano na Rys. 1.

Algorytm Kruskala w trakcie pracy buduje wiele cząstkowych drzew rozpinających i stopniowo łączy je w jedno wynikowe drzewo. Taki sposób działania powoduje, że algorytm ten idealnie współpracuje ze strukturą danych o nazwie Union-Find, zwanej także strukturą zbiorów rozłącznych. Struktura ta „śledzi losy” pewnych obiektów, pogrupowanych w rozłączne zbiory, i pozwala na wykonywanie dwóch typów operacji: łączenia (union) — podane dwa zbiory zostają połączone w jeden zbiór, oraz znajdowania (find)

— dla podanego numeru obiektu wskazany zostaje zbiór, do którego ten obiekt należy (odbywa się to poprzez wskazanie reprezenta lub tzw. elementu kanonicznego zbioru).

Na wysokim poziomie algorytm Kruskala można wypowiedzieć następująco:

1. Zainicjalizuj strukturę Union-Find (na początku każdy węzeł stanowi odrębny jednoelementowy zbiór).

2. Posortuj krawędzie grafu według wag rosnąco.

3. Dla każdej krawędzi (i, j) w posortowanej kolekcji:

3.1 Znajdź zbiór, do którego należy węzeł i (operacja find).

3.2 Znajdź zbiór, do którego należy węzeł j (operacja find).

3.3 Jeżeli znalezione zbiory dla i oraz j są różne to: dodaj krawędź (i, j) do wynikowego drzewa rozpinającego oraz połącz te zbiory (operacja union).

4. Zwróć wynikowe drzewo rozpinające.

1

(2)

(a) (b)

0

1

2 3

4

5 6

7

8

9 10

11

12

13 14

15

16

17

18 19

0

1

2 3

4

5 6

7

8

9 10

11

12

13 14

15

16

17

18

19 20

21 22

23 24

25

26

27 28 29 30 31 32

33

34 35

36

37 38 39

40 41

42

43

44

45

46

47

48 49

50

51

52 53

54

55

56

57 58

59 60

61

62 63

64 65

66

67

68 69

70

71

72

73 74

75 76 77

78 79

80

81

82

83

84 85

86 87

88 89 90

91 92

93

94

95 96

97

98

99

Rysunek 1: Przykładowe minimalne drzewa rozpinające dla grafów, w których liczby węzłów i krawędzi wynoszą: (a) n = 20, e = 65, (b) n = 100, e = 378. Wagi odpowiadają odległościom pomiędzy węzłami w linii prostej.

Każdy ze zbiorów rozłącznych jest w ramach struktury Union-Find przechowywany w postaci drzewa, przy czym wykorzystuje się prostą implementację indeksową. Tzn. cała kolekcja takich drzew jest re- prezentowana przez jedną tablica z indeksami rodziców (do celów pomocniczych można prowadzić także drugą tablicę tzw. rang1).

Jeżeli n i e oznaczają odpowiednio liczbę węzłów i krawędzi w grafie, to złożoność algorytmu Kruskala jest rzędu O(e log e), co gdy graf jest gęsty, tzn. dla e bliskiego n(n − 1)/2, jest równoważne złożoności O(n2log n).

2 Instrukcje, wskazówki, podpowiedzi

1. Na potrzeby tego ćwiczenia w implementacji należy przewidzieć pewne pomocnicze typy (struktury lub klasy) reprezentujące: węzeł w grafie (ze współrzędnymi x, y), krawędź w grafie (para indeksów wraz z kosztem), oraz sam graf. Obiekty te będą w ramach eksperymentów wczytywane z plików tekstowych (patrz zawartość pliku pklesk kruskal union find.zip, który towarzyszy tej instrukcji).

2. Implementacja może wykorzystywać wcześniej wykonane własne kontenery np. listy lub tablicy dynamicznej (np. poprzez dołączenie odpowiednich plików nagłówkowych .h) w celu: przechowania węzłów lub krawędzi grafu, reprezentacji wynikowego MST, itp.

1ranga to górne ograniczenie na wysokość drzewa

2

(3)

3. Struktura Union-Find może zostać zaimplementowana w formie klasy (lub struktury) zawie- rającej dwie tablice liczb całkowitych. Jedna z nich będzie przechowywała wskazania na indeksy obiektów-rodziców w ramach zbiorów rozłącznych — i tym samym będzie stanowiła reprezentację kolekcji drzew. Druga tablica będzie przechowywała rangi (czyli górne ograniczenia na wysokości drzew). Interfejs tej stuktury powinien zawierać następujące funkcje / metody:

(a) konstruktor (argument: n — liczba węzłów w grafie),

(b) łączenie dwóch zbiorów (argumenty: dwa indeksy węzłów, których zbiory chcemy połączyć), (c) znajdowanie reprezentanta zbioru (argument: indeks węzła; wynik: indeks reprezentanta zbio-

ru, do którego należy podany węzeł).

Uwaga: zgodnie z informacjami z wykładu, należy przygotować dwa warianty metody łączenia (zwykłe łączenie oraz „union-by-rank”), a także dwa warianty metody znajdowania (bez i z kom- presją ścieżki — „path compression”).

4. Algorytm Kruskala może być zrealizowany jako funkcja otrzymująca jako argument graf (lub listę wszystkich krawędzi) i zwracająca jako wynik minimalne drzewo rozpinające (wynik może być także listą z podzbiorem krawędzi). Wewnątrz funkcji należy wykorzystać dowolny własny algorytm sortujący (nie gorszy niż klasy e log e).

3 Eksperymenty

Wewnątrz spakowanego pliku pklesk kruskal union find.zip znajdują się trzy pliki tekstowe g1.txt, g2.txt, g3.txt reprezentujące grafy. Format: n — liczba węzłów (wiersz pierwszy), współrzędne (x, y) węzłów oddzielone spacją (kolejne n wierszy), e — liczba krawędzi (wiersz nr n + 2), krawędzie podane w formie pary indeksów i wagi oddzielonych spacjami (kolejne e wierszy). Należy przygotować funkcję, która potrafi odczytywać pliki tekstowe w tym formacie i zamieniać je na grafy. Uwaga: informacje o współrzędnych (x, y) węzłów nie będą bezpośrednio potrzebne, ponieważ koszty wag (równe odległościom pomiędzy węzłami) zostały już obliczone. Współrzędne można ewentualnie wykorzystać do weryfikacji wizualnej i wyrysowania grafu (poza oceną).

Dla wspomnianych trzech grafów należy wykonać algorytm Kruskala raportując na ekran:

- liczbę krawędzi i sumę wag w wynikowym drzewie rozpinającym, - czas obliczeń kroku sortującego krawędzie,

- czas obliczeń głównej pętli w algorytmie Kruskala,

- liczbę wykonań operacji find (należy wprowadzić odpowiedni licznik).

Eksperymenty należy powtórzyć włączając lub wyłączając warianty „union-by-rank” oraz „path com- pression”.

3

(4)

4 Sprawdzenie antyplagiatowe — przygotowanie wiadomości e-mail do wysłania

1. Kod źródłowy programu po sprawdzeniu przez prowadzącego zajęcia laboratoryjne musi zostać przesłany na adres algo2@zut.edu.pl.

2. Plik z kodem źródłowym musi mieć nazwę wg schematu: nr albumu.algo2.nr lab.main.c (plik może mieć rozszerzenie .c lub .cpp). Przykład: 123456.algo2.lab06.main.c (szóste zadanie laboratoryjne studenta o numerze albumu 123456). Jeżeli kod źródłowy programu składa się z wielu plików, to należy stworzyć jeden plik, umieszczając w nim kody wszystkich plików składowych.

3. Plik musi zostać wysłany z poczty ZUT (zut.edu.pl).

4. Temat maila musi mieć postać: ALGO2 IS1 XXXY LAB06, gdzie XXXY to numer grupy (np. ALGO2 IS1 210C LAB06).

5. W pierwszych trzech liniach pliku z kodem źródłowym w komentarzach muszą znaleźć się:

- informacja identyczna z zamieszczoną w temacie maila (linia 1), - imię i nazwisko autora (linia 2),

- adres e-mail (linia 3).

6. Mail nie może zawierać żadnej treści (tylko załącznik).

7. W razie wykrycia plagiatu, wszytkie uwikłane osoby otrzymają za dane zadanie ocenę 0 punktów (co jest gorsze niż ocena 2 w skali {2, 3, 3.5, 4, 4.5, 5}).

4

Cytaty

Powiązane dokumenty

Idea algorytmu Kruskala: z posortowanej niemalejąco wg wag listy krawędzi – dołączane są kolejne, jeśli nie tworzą cyklu (algorytm zachłanny).. Algorytmy grafowe: minimalne

Podniecający staje się moment, w którym wyobraźnia podpowiada co jest dalej, co jest głębiej, co jest za.. Jest to przyjemność porównywalna do odkrywania

De temperatuur moet tussen deze twee waarden gekozen worden om redenen, die besproken zullen worden in het hoofdstuk over procescondities.. Tevens kost het

Niewątpliwie rytuał chrztu, podobnie jak pierwszej komunii, posiada charakter masowy, co łączy się z bardziej obiektywnym niż subiektywnym ujęciem sacrum oraz większą

W swojej pracy starałam się przyjąć optykę Palamasa i analizować poszczególne zagadnienia Corpusu w maksymalnie chrześcijańskim duchu, nie izolując ich od siebie i

G robler przyjmuje poglądy L audana i określa stanowisko, „w którym o racjonalności akceptacji przekonań decyduje nie stopień uzasadnienia [...] tylko odpow

P ro blem y archeologii dziew iętna­ stow

The fracture network, permeability distribution of heterogeneous rock matrix, pressure and saturation plots of fine-scale and ADM simulations related to test case 2 are illustrated