Minimalne drzewo rozpinaj ce

Podobne dokumenty
Minimalne drzewo rozpinaj ce

Minimalne drzewa rozpinaj ce

Algorytmy grafowe 2. Andrzej Jastrz bski. Akademia ETI. Politechnika Gda«ska Algorytmy grafowe 2

Najkrótsze drogi w grafach z wagami

Podstawowe algorytmy grafowe i ich zastosowania

Zadania z kolokwiów ze Wst pu do Informatyki. Semestr II.

Wykład 8. Drzewo rozpinające (minimum spanning tree)

Podstawowe algorytmy grafowe i ich zastosowania

Najkrótsze drogi w grafach z wagami

c Marcin Sydow Spójno± Grafy i Zastosowania Grafy Eulerowskie 2: Drogi i Cykle Grafy Hamiltonowskie Podsumowanie

Zad. 1 Zad. 2 Zad. 3 Zad. 4 Zad. 5 SUMA. W obu podpunktach zakªadamy,»e kolejno± ta«ców jest wa»na.

Drzewa Gomory-Hu Wprowadzenie. Drzewa Gomory-Hu. Jakub Š cki. 14 pa¹dziernika 2009

c Marcin Sydow Przepªywy Grafy i Zastosowania Podsumowanie 12: Przepªywy w sieciach

Teoria grafów i sieci 1 / 188

Lab. 02: Algorytm Schrage

Notatki z AiSD. Nr 2. 4 marca 2010 Algorytmy Zachªanne.

Algorytmy i struktury danych

Egzaminy i inne zadania. Semestr II.

Teoria grafów i jej zastosowania. 1 / 126

Relacj binarn okre±lon w zbiorze X nazywamy podzbiór ϱ X X.

Algorytmy zwiazane z gramatykami bezkontekstowymi

12: Znajdowanie najkrótszych ±cie»ek w grafach

Grafy i Zastosowania. 5: Drzewa Rozpinaj ce. c Marcin Sydow. Drzewa rozpinaj ce. Cykle i rozci cia fundamentalne. Zastosowania

Metoda tablic semantycznych. 1 Metoda tablic semantycznych

Przekroje Dedekinda 1

TEORIA GRAFÓW. Graf skierowany dla ka»dej kraw dzi (oznaczanej tutaj jako ªuk) para wierzchoªków incydentnych jest par uporz dkowan {u, v}.

Elementy teorii grafów, sposoby reprezentacji grafów w komputerze

Listy i operacje pytania

JAO - J zyki, Automaty i Obliczenia - Wykªad 1. JAO - J zyki, Automaty i Obliczenia - Wykªad 1

c Marcin Sydow Planarno± Grafy i Zastosowania Tw. Eulera 7: Planarno± Inne powierzchnie Dualno± Podsumowanie

Podziaª pracy. Cz ± II. 1 Tablica sortuj ca. Rozwi zanie

Metodydowodzenia twierdzeń

Grafy. Andrzej Jastrz bski. Akademia ET I. Politechnika Gda«ska

Elementy teorii grafów, sposoby reprezentacji grafów w komputerze

Grafy i Zastosowania. 11: Twierdzenia Minimaksowe. c Marcin Sydow. Wst p: Tw. Halla. Dualno± Zbiory niezale»ne. Skojarzenia c.d.

Mosty królewieckie, chi«ski listonosz i... kojarzenie maª»e«stw

Algorytmy i Struktury Danych

i, lub, nie Cegieªki buduj ce wspóªczesne procesory. Piotr Fulma«ski 5 kwietnia 2017

ARYTMETYKA MODULARNA. Grzegorz Szkibiel. Wiosna 2014/15

Teoria grafów i sieci 1 / 58

Bash i algorytmy. Elwira Wachowicz. 20 lutego

Wykªad 4. Funkcje wielu zmiennych.

ARYTMETYKA MODULARNA. Grzegorz Szkibiel. Wiosna 2014/15

Egzaminy i inne zadania. Semestr II.

O pewnym zadaniu olimpijskim

Drzewa spinające MST dla grafów ważonych Maksymalne drzewo spinające Drzewo Steinera. Wykład 6. Drzewa cz. II

10a: Wprowadzenie do grafów

Metody dowodzenia twierdze«

Materiaªy do Repetytorium z matematyki

c Marcin Sydow Wst p Grafy i Zastosowania Wierzchoªki 8: Kolorowanie Grafów Mapy Kraw dzie Zliczanie Podsumowanie

Rekurencyjne struktury danych

c Marcin Sydow Grafy i Zastosowania BFS DFS 4: Przeszukiwanie Grafów (BFS, DFS i zastosowania) DFS nieskierowane DFS skierowane Podsumowanie

1 a + b 1 = 1 a + 1 b 1. (a + b 1)(a + b ab) = ab, (a + b)(a + b ab 1) = 0, (a + b)[a(1 b) + (b 1)] = 0,

ANALIZA NUMERYCZNA. Grzegorz Szkibiel. Wiosna 2014/15

Szukanie najkrótszych dróg z jednym ródłem

X WARMI SKO-MAZURSKIE ZAWODY MATEMATYCZNE 18 maja 2012 (szkoªy ponadgimnazjalne)

Zbiory i odwzorowania

Algorytmiczna teoria grafów

1 Klasy. 1.1 Denicja klasy. 1.2 Skªadniki klasy.

Maszyny Turinga i problemy nierozstrzygalne. Maszyny Turinga i problemy nierozstrzygalne

Programowanie wspóªbie»ne

Wykªad 4. Droga i cykl Eulera i Hamiltona

ARYTMETYKA MODULARNA. Grzegorz Szkibiel. Wiosna 2014/15

c Marcin Sydow Podstawy Grafy i Zastosowania Kod Prüfera 3: Drzewa Drzewa ukorzenione * Drzewa binarne Zastosowania Podsumowanie

Podstawy matematyki dla informatyków

Ciaªa i wielomiany. 1 Denicja ciaªa. Ciaªa i wielomiany 1

Grafy i Zastosowania. 6: Najkrótsze ±cie»ki. c Marcin Sydow. Najkrótsze cie»ki. Warianty. Relaksacja DAG. Algorytm Dijkstry.

W poprzednim odcinku... Podstawy matematyki dla informatyków. Relacje równowa»no±ci. Zbiór (typ) ilorazowy. Klasy abstrakcji

WST P DO TEORII INFORMACJI I KODOWANIA. Grzegorz Szkibiel. Wiosna 2013/14

Algorytmy tekstowe. Andrzej Jastrz bski. Akademia ETI

A = n. 2. Ka»dy podzbiór zbioru sko«czonego jest zbiorem sko«czonym. Dowody tych twierdze«(elementarne, lecz nieco nu» ce) pominiemy.

1 Metody iteracyjne rozwi zywania równania f(x)=0

Programowanie wspóªbie»ne

ARYTMETYKA MODULARNA. Grzegorz Szkibiel. Wiosna 2014/15

Programowanie funkcyjne. Wykªad 13

XVII Warmi«sko-Mazurskie Zawody Matematyczne

Wykªad 7. Ekstrema lokalne funkcji dwóch zmiennych.

KLASYCZNE ZDANIA KATEGORYCZNE. ogólne - orzekaj co± o wszystkich desygnatach podmiotu szczegóªowe - orzekaj co± o niektórych desygnatach podmiotu

Przykªady problemów optymalizacji kombinatorycznej

Algorytmy i struktury danych

Wstp. Warto przepływu to

1 Granice funkcji wielu zmiennych.

Podstawowepojęciateorii grafów

Strategia czy intuicja?

ALGORYTMY SORTOWANIA DANYCH

Ekstremalnie fajne równania

ARYTMETYKA MODULARNA. Grzegorz Szkibiel. Wiosna 2014/15

PROE wykład 7 kontenery tablicowe, listy. dr inż. Jacek Naruniec

WST P DO TEORII INFORMACJI I KODOWANIA. Grzegorz Szkibiel. Wiosna 2013/14

Wybrane poj cia i twierdzenia z wykªadu z teorii liczb

Indeksowane rodziny zbiorów

Wyszukiwanie. Algorytmy i Struktury Danych. (c) Marcin Sydow. Dziel i rz d¹. Wyszukiwanie. Statystyki pozycyjne. Podsumowanie

1) Grafy eulerowskie własnoci algorytmy. 2) Problem chiskiego listonosza

Rozwi zanie równania ró»niczkowego metod operatorow (zastosowanie transformaty Laplace'a).

istnienie elementu neutralnego dodawania (zera): 0 K a K a + 0 = a, istnienie elementu neutralnego mno»enia (jedynki): 1 K a K a 1 = a,

Problemy optymalizacyjne - zastosowania

Zdzisªaw Dzedzej, Katedra Analizy Nieliniowej pok. 611 Kontakt:

Model obiektu w JavaScript

Programowanie i struktury danych 1 / 44

Wykªad 1. Wprowadzenie do teorii grafów

Transkrypt:

Minimalne drzewo rozpinaj ce Autor projektu: dr Andrzej Mróz (UMK) Projekt pn. Wzmocnienie potencjaªu dydaktycznego UMK w Toruniu w dziedzinach matematyczno-przyrodniczych realizowany w ramach Poddziaªania 4.1.1 Programu Operacyjnego Kapitaª Ludzki 1 / 50

Problem Ustalmy spójny niezorientowany graf G = (V, E) z funkcj wagi w : E R +. Rozwa»my nast puj c interpretacj grafu G : wierzchoªki V = {1, 2,..., n} = miasta, kraw dzie = potencjalne bezpo±rednie drogowe poª czenia pomi dzy miastami, waga w(i, j) kraw dzi {i, j} E = koszt budowy poª czenia pomi dzy miastami i i j. 2 / 50

Problem Zagadnienie optymalizacyjne. Zbudowa tylko te drogi spo±ród opisanych przez graf G (czyli wybra podgraf G grafu G ) tak, by: 1 pomi dzy ka»d par miast (wierzchoªków) istniaªo drogowe poª czenie (niekoniecznie bezpo±rednie), 2 koszt budowy tej sieci dróg byª najni»szy spo±ród wszystkich rozwi za«speªniaj cych punkt 1. 3 / 50

Problem Šatwo zauwa»y,»e je»eli podgraf G speªnia te wªasno±ci, to 1 zawiera wszystkie wierzchoªki grafu G, 2 jest spójny, 3 nie zawiera cykli. W szczególno±ci 2 i 3 oznaczaj,»e G powinien by drzewem. Tzw. minimalnym drzewem rozpinaj cym, które za chwil zdeniujemy w sposób bardziej formalny. Problem ten pojawia si w wielu innych kontekstach informatycznych, cz sto znalezienie minimalnego drzewa rozpinaj cego jest pierwszym krokiem w rozwi zaniach innych problemów. Czasem stosuje si te» nazw minimalne drzewo spinaj ce. 4 / 50

Drzewo rozpinaj ce Niech G = (V, E) b dzie spójnym grafem niezorientowanym. Denicja Drzewo rozpinaj ce (ang. spanning tree) grafu G = drzewo T = (V, E ) takie,»e E E. Tzn. T jest drzewem zawieraj cym wszystkie wierzchoªki G, za± jego zbiór kraw dzi jest podzbiorem zbioru kraw dzi G. Drzewo rozpinaj ce powstaje z grafu G poprzez usuni cie kraw dzi nale» cych do cykli. Ka»de drzewo rozpinaj ce grafu G ma V 1 kraw dzi. 5 / 50

Drzewo rozpinaj ce przykªad Drzewo rozpinaj ce nie jest poj ciem jednoznacznym. Dla grafu G : Drzewem rozpinaj cym jest podgraf T : 6 / 50

Drzewo rozpinaj ce przykªad Drzewo rozpinaj ce nie jest poj ciem jednoznacznym. Dla grafu G : Drzewem rozpinaj cym jest podgraf T 2 : 7 / 50

Drzewo rozpinaj ce przykªad Drzewo rozpinaj ce nie jest poj ciem jednoznacznym. Dla grafu G : Drzewem rozpinaj cym jest podgraf T 3 : 8 / 50

Minimalne drzewo rozpinaj ce Niech G = (V, E) b dzie spójnym grafem niezorientowanym z wag w : E R +. Dla dowolnego drzewa rozpinaj cego T = (V, E ) grafu G deniujemy jego wag w(t ) = w(u, v). (u,v) E Denicja Minimalne drzewo rozpinaj ce (ang. minimal spanning tree MST) grafu G = drzewo rozpinaj ce T o minimalnej wadze w(t ) (spo±ród wszystkich drzew rozpinaj cych grafu G ). 9 / 50

Minimalne drzewo rozpinaj ce przykªad Dla grafu z wagami: 15 2 1 8 2 9 13 10 przykªadowe wagi drzew rozpinaj cych: T : 1 w(t ) = 35 2 9 13 10 10 / 50

Minimalne drzewo rozpinaj ce przykªad Dla grafu z wagami: 15 2 1 8 2 9 13 10 przykªadowe wagi drzew rozpinaj cych: 2 T 2 : 15 8 w(t 2 ) = 48 13 10 11 / 50

Minimalne drzewo rozpinaj ce przykªad Dla grafu z wagami: 15 2 1 8 2 9 13 10 przykªadowe wagi drzew rozpinaj cych: 2 T 3 : 1 8 w(t 3 ) = 33 9 13 12 / 50

Minimalne drzewo rozpinaj ce przykªad Dla grafu z wagami: 15 2 1 8 2 9 13 10 minimalnym drzewem rozpinaj cym jest 2 1 8 9 T 3 : w(t 3 ) = 33 ale nie jest to jedyne MST: 1 8 2 9 13 T 4 : w(t 4 ) = 33 13 13 / 50

Cel - poszukiwanie MST Rozwi zanie naiwne: Wygenerowa wszystkie drzewa rozpinaj ce i wybra te o najmniejszej wadze. Oczywista wada: Drzew rozpinaj cych jest na ogóª bardzo du»o. Ponadto, wcale nie jest to takie proste pod wzgl dem implementacyjnym. Cel: Opracowa efektywn metod znajdowania (jakiegokolwiek) MST. 14 / 50

Strategia Ogólna strategia zachªanna rozrastanie si podgrafu T o zbiorze kraw dzi A, który na ko«cu b dzie MST. Dane: Spójny graf niezorientowany G = (V, E) z funkcj wagow w : E R +. Cel: Znalezienie MST dla G. Podgraf T rozrasta si w wyniku dodawania kolejnych kraw dzi. W czasie algorytmu trzymamy zbiór A, który zawsze jest podzbiorem zbioru kraw dzi pewnego MST. W ka»dym kroku wyznaczamy kraw d¹, któr mo»na doda do A bez straty jego wªasno±ci (kraw d¹ bezpieczn dla A). 15 / 50

Strategia B dziemy zatem realizowa strategi opisan przez bardzo ogólny pseudokod: GenericMST(G, w) 1 begin 2 A := ; 3 while A nie tworzy drzewa rozpinaj cego do 4 begin 5 znajd¹ kraw d¹ {u, v} E\A bezpieczn dla A; 6 A := A { {u, v} } 7 end 8 end; Poprawno± ogólnie: Niezmiennik A jest podzbiorem zbioru kraw dzi pewnego MST jest zachowany w ka»dym kroku. Kraw d¹ bezpieczna w ka»dym kroku istnieje gwarantuje to niezmiennik. 16 / 50

Problem Gªówny problem Jak rozpoznawa bezpieczn kraw d¹? Omówimy dwa ró»ne rozwi zania tego problemu, tj. dwie ró»ne realizacje ogólnej strategii GenericMST: Algorytm Kruskala. Algorytm Prima. 17 / 50

Idea algorytmu Kruskala Nieformalny opis W ka»dym kroku rozrastaj cy si podgraf T = (V, A) grafu G jest lasem (tj. jego skªadowe s drzewami). Na pocz tku A =, tj. skªadowe T to jednowierzchoªkowe drzewa. Dodaj c bezpieczn kraw d¹ do A scalamy dwie skªadowe T w jedn. Na ko«cu T scali si w jedno drzewo. 18 / 50

Idea algorytmu Kruskala Nieformalny opis c.d. W poszukiwaniu kraw dzi bezpiecznych w kolejnych krokach przetwarzamy kraw dzie w kolejno±ci ich rosn cych (niemalej cych) wag. Kraw d¹ e jest bezpieczna, gdy dodanie jej do A nie spowoduje pojawienia si cyklu (jest to równowa»ne z tym,»e e ª czy dwie ró»ne dotychczasowe skªadowe w T ). Nale»y zatem umie rozpoznawa ró»ne skªadowe w grae T. Do tego wykorzystamy now struktur danych, tzw. struktur zbiorów rozª cznych. 19 / 50

Idea algorytmu Prima Nieformalny opis W odró»nieniu od algorytmu Kruskala, tu T zawsze stanowi jedno drzewo. Na pocz tku T ma 1 wierzchoªek (dowolnie wybrany z G ). W ka»dym kroku kraw d¹ bezpieczna to kraw d¹ o najmniejszej wadze spo±ród kraw dzi wystaj cych z T (tj. ª cz cych wierzchoªek z T z wierzchoªkiem spoza T ). Nale»y zatem umie efektywnie wybiera kraw dzie bezpieczne j.w. Do tego wykorzystamy odpowiedni kolejk priorytetow. 20 / 50

Struktury danych dla zbiorów rozª cznych W algorytmie Kruskala wykorzystamy nast puj c dynamiczn struktur danych. Kontekst: n ró»nych elementów pogrupowanych w pewn liczb zbiorów rozª cznych. Cel: zdeniowanie i zarz dzanie strukturami danych umo»liwiaj cymi operacje m.in.: ª czenia dwóch zbiorów, stwierdzania, do którego zbioru nale»y element x, stwierdzania, czy dwa elementy x, y nale» do tego samego zbioru. 21 / 50

Struktury danych dla zbiorów rozª cznych Zarz dzanie rodzin S = {S 1, S 2,..., S k } rozª cznych zbiorów dynamicznych. Pomysª: ka»dy zbiór S i identykujemy poprzez jego reprezentanta, czyli wyró»niony element x S i. Warunki nakªadane na reprezentanta: na ogóª nie ma znaczenia, który element jest reprezentantem, wa»ne jest, by zadaj c dwukrotnie pytanie o reprezentanta danego zbioru, otrzyma tak sam odpowied¹, o ile zbiór w tym czasie si nie zmieniaª, czasami ustala si na pocz tku pewn zasad wyboru reprezentanta (np. element z najmniejszym kluczem...). 22 / 50

Struktury danych dla zbiorów rozª cznych Podstawowe operacje: MakeSet(x) tworzy nowy jednoelementowy zbiór S = {x} (o reprezentancie x); x nie mo»e by elementem innego zbioru. Union(x, y) ª czy dwa rozª czne zbiory S x, S y zawieraj ce odpowiednio x i y w nowy zbiór S x S y. Jego reprezentantem mo»e by dowolny element S x S y, na ogóª reprezentant S x lub S y. FindSet(x) zwraca wska¹nik do reprezentanta (jedynego) zbioru zawieraj cego x. stwierdzanie, czy dwa elementy x, y nale» do tego samego zbioru: test FindSet(x) = FindSet(y). 23 / 50

Proste zastosowanie Przykªad zastosowania: rozpoznawanie spójnych skªadowych w grae (niezorientowanym) G = (V, E). ConnectedComponents(G) 1 begin 2 for ka»dy v V do 3 MakeSet(v); 4 for ka»da (u, v) E do 5 if FindSet(u) <> FindSet(v) then 6 Union(u, v); 7 end; Po wykonaniu podziaª wierzchoªków na zbiory rozª czne odpowiada podziaªowi na skªadowe spójno±ci. W podobnym kontek±cie wykorzystamy zbiory rozª czne w algorytmie Kruskala (który jest de facto pewn modykacj powy»szej procedury). 24 / 50

Proste zastosowanie SameComponent(u, v) 1 begin 2 if FindSet(u) = FindSet(v) then 3 return true 4 else return false 5 end; Wiemy: do wyznaczania skªadowych mo»na wykorzysta przegl danie grafu. Gdy do grafu kraw dzie s dodawane w czasie dziaªania algorytmu (czyli trzeba uaktualnia spójne skªadowe), to implementacja przy pomocy zbiorów rozª cznych mo»e by efektywniejsza. 25 / 50

Heurystyka W dalszej cz ±ci przeprowadzimy prost analiz heurystyczn. Przez heurystyk rozumiemy tu takie projektowanie operacji, by zmniejszy ich koszt zamortyzowany (niekoniecznie koszt pesymistyczny = zªo»ono± pesymistyczn ). Denicja Koszt zamortyzowany = koszt ±redni operacji P w ci gu n wykona«operacji P. Uwaga Sªowo heurystyka ma w informatyce równie» inne znaczenia. 26 / 50

Heurystyka Przykªad. Wykonujemy kolejno n sortowa«algorytmem sortowania b - belkowego P na tym samym zbiorze danych X. Wówczas tylko za pierwszym razem wykonywane s nietrywialne modykacje na X, st d tu koszt zamortyzowany jest znacznie ni»szy ni» koszt pesymistyczny algorytmu P. Oczywi±cie koszt zamortyzowany istotnie zale»y od kontekstu wykonywania danej operacji. 27 / 50

Implementacja listy Implementacja zbiorów rozª cznych w postaci list. Ka»dy zbiór przechowywany jako (dynamiczna) lista. Pierwszy skªadnik listy = reprezentant zbioru. Ka»dy skªadnik listy posiada pola: element zbioru, wska¹nik do nast pnego skªadnika listy, wska¹nik (prowadz cy wstecz) do reprezentanta. 28 / 50

Implementacja listy MakeSet(x) stworzenie nowej listy o jedynym skªadniku x. Zªo»ono± : O(1). FindSet(x) zwrócenie wska¹nika od x do reprezentanta zbioru. Zªo»ono± : O(1). Union(x, y) doª czenie listy L y z elementem y na koniec listy L x z elementem x. Reprezentantem nowego zbioru jest element b d cy wcze±niej reprezentantem zbioru zawieraj cego x. Trzeba uaktualni wska¹nik do reprezentanta we wszystkich skªadnikach znajduj cych si pierwotnie na li±cie L y. Zªo»ono± : O(s), gdzie s = L y (gdy mamy dost p do ostatniego elementu L x ). 29 / 50

Implementacja listy Usprawnienie: heurystyka ª czenia z wywa»aniem. Zawsze doª czamy krótsz list do dªu»szej. Trzeba przechowywa (np. w reprezentancie) i uaktualnia rozmiar listy. Asymptotyczna zªo»ono± pojedynczej operacji Union pozostaje taka sama, lecz koszt zamortyzowany jest mniejszy. Wykonanie ci gu m operacji MakeSet, Union i FindSet, spo±ród których n to MakeSet zajmuje przy wywa»aniu czas O(m + nlog n). Bez wywa»ania: O(m 2 ). 30 / 50

Implementacja drzewa z korzeniem Implementacja w postaci drzew z korzeniem. Ka»dy zbiór przechowywany jako drzewo z korzeniem. Korze«drzewa = reprezentant zbioru. Ka»dy wierzchoªek drzewa posiada pola: element zbioru, wska¹nik do ojca w drzewie (korze«wskazuje na siebie). Struktur drzewa mo»na tak»e zaimplementowa przy wykorzystaniu tablicy ojców indeksowanej elementami, które grupujemy w zbiory. 31 / 50

Implementacja drzewa z korzeniem Przykªad. Trzy zbiory rozª czne grupuj ce 10 elementów, reprezentowane poprzez drzewa: 2 1 5 3 6 4 7 10 9 8 s jednoznacznie zakodowane przy pomocy tablicy ojców: i 1 2 3 4 5 6 7 8 9 10 ojciec[i] 2 2 6 6 2 6 4 8 4 4 32 / 50

Implementacja drzewa z korzeniem MakeSet(x) stworzenie nowego drzewa o jedynym wierzchoªku x. Zªo»ono± : O(1). FindSet(x) przej±cie po wska¹nikach od x do ojca itp. a» do korzenia. Zªo»ono± : O(h), gdzie h = wysoko± drzewa. Union(x, y) zmiana wska¹nika w korzeniu drzewa T x (zawieraj cego x) tak aby wskazywaª na korze«drzewa T y (zawieraj cego y). Zªo»ono± : O(1) (gdy mamy dost p do korzeni). 33 / 50

Implementacja drzewa z korzeniem Dwie heurystyki: 1 Š czenie wg wysoko±ci: drzewo o mniejszej wysoko±ci doª czamy do drzewa o wi kszej wysoko±ci (+ uaktualnienie wysoko±ci). 2 Kompresja drogi: stosowana przy operacji FindSet(x) polega na zmianie wska¹ników we wszystkich wierzchoªkach na drodze od x do korzenia tak, by wskazywaªy na korze«. 34 / 50

Implementacja drzewa z korzeniem Implementacja z uwzgl dnieniem heurystyk. Oznaczenia: h(x) = wysoko± wierzchoªka x ( N), ojciec(x) = ojciec wierzchoªka x (wska¹nik lub odwoªanie do tablicy ojców). MakeSet(x) 1 begin 2 ojciec(x) := x; 3 h(x) := 0 4 end; 35 / 50

Implementacja drzewa z korzeniem Implementacja z uwzgl dnieniem heurystyk ª czenie wg wysoko±ci: Link(x, y) 1 begin 2 if h(x) > h(y) then 3 ojciec(y) := x 4 else begin 5 ojciec(x) := y; 6 if h(x) = h(y) then 7 h(y) := h(y) + 1 8 end 9 end; Union(x, y) 1 begin 2 Link(FindSet(x), FindSet(y)) 3 end; 36 / 50

Implementacja drzewa z korzeniem Implementacja z uwzgl dnieniem heurystyk kompresja drogi: FindSet(x) 1 begin 2 if x <> ojciec(x) then 3 ojciec(x) := FindSet( ojciec(x) ); 4 return ojciec(x) 5 end; Uwaga Zauwa»my,»e po FindSet wysoko± drzewa mo»e ulec zmianie (zmniejszeniu). Mimo to, nie uaktualniamy warto±ci h dla»adnego wierzchoªka. Utrzymywanie poprawnych warto±ci wysoko±ci drzew byªoby niepotrzebnie kosztowne. Zatem warto±ci h nale»y tak naprawd interpretowa jako górne ograniczenia wysoko±ci drzew. 37 / 50

Implementacja drzewa z korzeniem Zaªó»my,»e wykonujemy ci g m operacji MakeSet, Union i FindSet, spo±ród których n to MakeSet. Twierdzenie (Hopcroft, Ullman) Zªo»ono± wykonania ci gu powy»szych operacji z uwzgl dnieniem heurystyk 1 i 2 wynosi O(m log n). log = logarytm iterowany. log jest funkcj bardzo wolno rosn c. log n 5 dla wszystkich 1 n 2 65536. Liczba atomów we wszech±wiecie 10 80 < 2 65536. 38 / 50

Poprawno± Zanim przedstawimy konkretny pseudokod, wprowadzimy kilka poj i faktów pozwalaj cych zrozumie, dlaczego idea algorytmu Kruskala przedstawiona wcze±niej zawsze daje poprawne rozwi zanie. Poj cia te wyst puj te» w innych kontekstach algorytmów grafowych. Bardziej szczegóªowy dowód poprawno±ci mo»na znale¹ np. w ksi»ce [1] ze spisu literatury do wykªadu (T. H. Cormen et al.). 39 / 50

Przekroje Denicje: Ka»dy podzbiór S V wyznacza przekrój (S, V \ S) grafu G = (V, E). Kraw d¹ {u, v} krzy»uje si z przekrojem (S, V \ S), je±li jeden z jej ko«ców nale»y do S, a drugi do V \ S. Przekrój (S, V \ S) uwzgl dnia zbiór kraw dzi A, je±li»adna kraw d¹ z A nie krzy»uje si z tym przekrojem. Kraw d¹ e E krzy»uj ca si z przekrojem jest kraw dzi lekk, je±li w(e) jest najmniejsza spo±ród wag wszystkich kraw dzi krzy»uj cych si z tym przekrojem. 40 / 50

Przekroje G = (V, E) spójny graf niezorientowany z funkcj wagow w : E R + Twierdzenie Niech E A podzbiór zbioru kraw dzi pewnego MST dla G, (S, V \ S) dowolny przekrój grafu G uwzgl dniaj cy A, {u, v} kraw d¹ lekka krzy»uj ca si z (S, V \ S). Wówczas kraw d¹ {u, v} jest bezpieczna dla A. 41 / 50

Przypomnienie idei algorytmu GenericMST(G, w) 1 begin 2 A := ; 3 while A nie tworzy drzewa rozpinaj cego do 4 begin 5 znajd¹ kraw d¹ {u, v} E\A bezpieczn dla A; 6 A := A { {u, v} } 7 end 8 end; Rozwa»my graf T = (V, A). W ka»dym kroku jest on acykliczny ka»da jego spójna skªadowa jest drzewem. na pocz tku A = T skªada si z V jednowierzchoªkowych drzew, poniewa» A { {u, v} } musi by acykliczny, ka»da bezpieczna kraw d¹ {u, v} dla A ª czy ró»ne skªadowe z T, w ka»dym kroku kolejne skªadowe T ª cz si (liczba drzew maleje), na ko«cu las T zawiera tylko 1 drzewo jest MST. 42 / 50

Przekroje Wniosek Niech E A podzbiór zbioru kraw dzi pewnego MST dla G, C = spójna skªadowa w lesie T = (V, A), {u, v} kraw d¹ o najmniejszej wadze spo±ród ª cz cych C z pewn inn skªadow w T. Wówczas kraw d¹ {u, v} jest bezpieczna dla A. Dowód. Przekrój (C, V \ C) uwzgl dnia A. {u, v} jest kraw dzi lekk krzy»uj c si z tym przekrojem. Na mocy twierdzenia {u, v} jest kraw dzi bezpieczn dla A. 43 / 50

Algorytm Podsumowanie: szczegóªowa wersja algorytmu GenericMST algorytm Kruskala (por. ConnectedComponents). MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; Zªo»ono± : O( E log E ) (przy najszybszych implementacjach zbiorów rozª cznych i sortowania, por. Tw. HopcroftUllman). 44 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Algorytm przebieg MST-Kruskal(G, w) 1 begin 2 A := ; 3 for ka»dy v V do 4 MakeSet(v); 5 posortuj E niemalej co wzgl dem wag w; 6 for ka»da {u, v} E, w kolejno±ci niemalej cych wag do 7 if FindSet(u) <> FindSet(v) then 8 begin 9 A := A { {u, v} }; 10 Union(u, v) 11 end 12 return A 13 end; 15 2 1 8 2 9 13 10 45 / 50

Poprawno± Inna realizacja ogólnego algorytmu GenericMST algorytm Prima W przeciwie«stwie do algorytmu Kruskala, kraw dzie z A tworz zawsze pojedyncze drzewo. Pocz tkowo drzewo to skªada si z dowolnie wybranego wierzchoªka-korzenia r V ; nast pnie ro±nie do chwili, w której rozpina wszystkie wierzchoªki z V. Rozwa»any przekrój: (V (A), V \ V (A)) (V (A) := zbiór ko«ców kraw dzi z A). W ka»dym kroku dodajemy kraw d¹ lekk krzy»uj c si z tym przekrojem (tj. kraw d¹ o najmniejszej wadze spo±ród tych wystaj cych z A). Przekrój (V (A), V \ V (A)) uwzgl dnia A, zatem kraw d¹ ta jest bezpieczna dla A (patrz twierdzenie). 46 / 50

Implementacja Jak wyznacza kraw d¹ lekk krzy»uj c si z przekrojem (V (A), V \ V (A))? Wierzchoªki spoza rozrastaj cego si drzewa trzymamy w kolejce priorytetowej Q (por. poprzedni wykªad). Dla ka»dego v V kluczem klucz(v) (tzn. priorytetem wyznaczaj cym pozycj w kolejce Q) jest najmniejsza waga spo±ród wag kraw dzi ª cz cych v z wierzchoªkami drzewa. W zmiennej π[v] pami tamy ojca v w obliczanym drzewie. 47 / 50

Implementacja Podczas wykonywania algorytmu zbiór A jest pami tany niejawnie jako A = { {π[v], v} : v (V \ {r}) \ Q}. Po zako«czeniu algorytmu Q =, zbiorem kraw dzi MST w G jest wi c A = { {π[v], v} : v V \ {r}}. Przypomnijmy,»e symbolem Adj[u] oznaczamy zbiór s siadów wierzchoªka u. 48 / 50

Algorytm Inna realizacja ogólnego algorytmu algorytm Prima. MST-Prim(G, w, r) 1 begin 2 Q := V; 3 for ka»dy u Q do klucz(u) := ; 4 klucz(r) := 0; 5 π[r] := ; 6 while Q <> do 7 begin 8 u := ExtractMin(Q); 9 for ka»dy v Adj[u] do 10 if (v Q) and (w(u, v) < klucz(v)) then 11 begin 12 π[v] := u; 13 klucz[v] := w(u, v) 14 end 15 end; 16 return π 17 end; Zªo»ono± : O( E log V ) (gdy kolejka implementowana na kopcu). 49 / 50

MST-Prim(G, w, r) 1 begin 2 Q := V; 3 for ka»dy u Q do klucz(u) := ; 4 klucz(r) := 0; 5 π[r] := ; 6 while Q <> do 7 begin 8 u := ExtractMin(Q); 9 for ka»dy v Adj[u] do 10 if (v Q) and (w(u, v) < klucz(v)) then 11 begin 12 π[v] := u; 13 klucz[v] := w(u, v) 14 end 15 end; 16 return π 17 end; 15 2 r 1 8 2 9 13 10 50 / 50

MST-Prim(G, w, r) 1 begin 2 Q := V; 3 for ka»dy u Q do klucz(u) := ; 4 klucz(r) := 0; 5 π[r] := ; 6 while Q <> do 7 begin 8 u := ExtractMin(Q); 9 for ka»dy v Adj[u] do 10 if (v Q) and (w(u, v) < klucz(v)) then 11 begin 12 π[v] := u; 13 klucz[v] := w(u, v) 14 end 15 end; 16 return π 17 end; 15 2 r 1 8 2 9 13 10 50 / 50

MST-Prim(G, w, r) 1 begin 2 Q := V; 3 for ka»dy u Q do klucz(u) := ; 4 klucz(r) := 0; 5 π[r] := ; 6 while Q <> do 7 begin 8 u := ExtractMin(Q); 9 for ka»dy v Adj[u] do 10 if (v Q) and (w(u, v) < klucz(v)) then 11 begin 12 π[v] := u; 13 klucz[v] := w(u, v) 14 end 15 end; 16 return π 17 end; 15 2 r 1 8 2 9 13 10 50 / 50

MST-Prim(G, w, r) 1 begin 2 Q := V; 3 for ka»dy u Q do klucz(u) := ; 4 klucz(r) := 0; 5 π[r] := ; 6 while Q <> do 7 begin 8 u := ExtractMin(Q); 9 for ka»dy v Adj[u] do 10 if (v Q) and (w(u, v) < klucz(v)) then 11 begin 12 π[v] := u; 13 klucz[v] := w(u, v) 14 end 15 end; 16 return π 17 end; 15 2 r 1 8 2 9 13 10 50 / 50

MST-Prim(G, w, r) 1 begin 2 Q := V; 3 for ka»dy u Q do klucz(u) := ; 4 klucz(r) := 0; 5 π[r] := ; 6 while Q <> do 7 begin 8 u := ExtractMin(Q); 9 for ka»dy v Adj[u] do 10 if (v Q) and (w(u, v) < klucz(v)) then 11 begin 12 π[v] := u; 13 klucz[v] := w(u, v) 14 end 15 end; 16 return π 17 end; 15 2 r 1 8 2 9 13 10 50 / 50

MST-Prim(G, w, r) 1 begin 2 Q := V; 3 for ka»dy u Q do klucz(u) := ; 4 klucz(r) := 0; 5 π[r] := ; 6 while Q <> do 7 begin 8 u := ExtractMin(Q); 9 for ka»dy v Adj[u] do 10 if (v Q) and (w(u, v) < klucz(v)) then 11 begin 12 π[v] := u; 13 klucz[v] := w(u, v) 14 end 15 end; 16 return π 17 end; 15 2 r 1 8 2 9 13 10 50 / 50