Wykład 8 Drzewo rozpinające (minimum spanning tree) 1
Minimalne drzewo rozpinające - przegląd Definicja problemu Własności minimalnych drzew rozpinających Algorytm Kruskala Algorytm Prima Literatura Cormen, Leiserson, Rivest, Wprowadzenie do algorytmów, rozdz. 4
Problem Mamy dany zbiór wierzchołków i możliwych połączeń wraz z ich wagami, chcemy znaleźć taki podzbiór połączeń, żeby wszystkie wierzchołki były połączone oraz suma wag tych połączeń była minimalna. Przykłady: Komutowanie łącza telefonicznego Tworzenie instalacji elektrycznej w budynku Węzły wraz z wybranymi połączeniami tworzą drzewo! Drzewo to nazywane jest MINIMALNYM DRZEWEM ROZPINAJĄCYM (Minimum Spanning Tree MST) 3
Przykład drzewa rozpinającego (to nie jest minimalne) a 4 8 8 7 b c d 11 i 4 14 7 6 h 1 g f 9 10 e koszt: 51 4
Przykład drzewa rozpinającego (minimalne) a 4 8 8 7 b c d 11 i 4 14 7 6 h 1 g f 9 10 e koszt: 37 5
Drzewa rozpinające Definicja: niech G=(V,E) będzie ważonym i spójnym grafem nieskierowanym. Drzewem rozpinającym dla G nazywamy podzbiór krawędzi T E, taki że podgraf G =(V,T) jest grafem spójnym, nie zawierającym cykli. Minimalnym drzewem rozpinającym (MST) nazywamy drzewo rozpinające, dla którego suma wag wszystkich krawędzi jest minimalna : ( u,v ) ( ) = w( u,v ) w T T 6
Podstawowy algorytm MST Strategia zachłanna: minimalne drzewo rozpinające rozrasta się poprzez dołączanie do niego w każdym kroku jednej krawędzi, przy jednoczesnym sprawdzaniu zachowania warunków( zachowanie struktury drzewa i warunku minimalności dodawana krawędź jest bezpieczna po jej dodaniu dalej dostajemy podzbiór minimalnego drzewa). Generic-MST(G=(V,E)) T = ; while (T nie tworzy drzewa rozpinającego dla G) do znajdź krawędź e=(u,v) E bezpieczną dla T T = T {e} return T 7
Własności MST Pytanie: jak efektywnie odnaleźć tę bezpieczną krawędź? Twierdzenie 1: niech U V i e=(u,v) będzie krawędzią o minimalnej wadze rozpoczynającą się w U i kończącą w V U. Istnieje wtedy minimalne drzewo rozpinające T, takie że e T. U T V U V 8
Własności MST podział 4 a 8 U 8 7 b c d 11 i 4 14 7 6 h 1 g f V U 9 e 10 9
Własności MST Twierdzenie : niech G=(V,E) będzie spójnym grafem nieskierowanym, A podzbiorem E zawartym w pewnym minimalnym drzewie rozpinającym T dla G. Niech (U, V U) będzie przekrojem G względem A (nie ma krawędzi dla wierzchołków ze zbioru A krzyżujących się z podziałem), i niech e=(u,v) będzie krawędzią lekką (o minimalnej wadze) krzyżującą się z przekrojem (U, V U). Wtedy e jest bezpieczna dla A. T V U U V podział 10
Własności MST Wniosek: niech G=(V,E) będzie spójnym grafem nieskierowanym, A podzbiorem E zawartym w pewnym minimalnym drzewie rozpinającym T dla G, niech dalej C = (V C, E C ) będzie składową (drzewem) w lesie G A = (V,A). Jeśli e jest lekką krawędzią łączącą C z pewną inną składową w G A, wtedy e jest bezpieczne dla A. Dowód: przekrój (V C, V V C ) uwzględnia A, i e jest krawędzią lekką dla tego przekroju. Stad e jest bezpieczne. 11
Algorytmy wyznaczania MST Wykorzystuje się dwa sposoby odnajdowania bezpiecznych krawędzi: 1. Algorytm Kruskala: zbiór A jest lasem i dodawana bezpieczna krawędź jest zawsze najlżejszą krawędzią w grafie łączącą dwa rozdzielone poddrzewa z tego lasu (Tw. ).. Algorytm Prima: zbiór A jest drzewem, a dodawana bezpieczna krawędź jest najlżejszą krawędzią łączącą A z wierzchołkiem spoza A (Tw. 1). 1
Algorytm Kruskala MST-Kruskal(G) A for każdy wierzchołek v V do Make-Set(v) posortuj krawędzie z E niemalejąco względem wag for każda krawędź e = (u,v) E do then return A if Find-Set(u) Find-Set(v) A A {e} Union(u,v) Łączymy drzewa Każdy wierzchołek staje się osobnym drzewem Drzewa są rozdzielone 13
Przykład alg. Kruskala a 4 8X 8 7 b c d 11 i 4 14 7X X6 h 1 g f 9 10 e koszt: 37 14
Analiza alg. Kruskala Poprawność: wynika wprost z Tw.. Złożoność: zależy od implementacji operacji dla zbiorów rozłącznych! Dla asymptotycznie najlepszej znanej dostajemy: Sortowanie krawędzi zajmuje O( E lg E ). Pętla for przebiegająca zbiór krawędzi wykonuje dwie operacje Find-Set i jedną Union. Może być to implementowane w czasie O(1). Ostatecznie dostajemy: O( E lg E ) = O( E lg V ). Dla implementacji naiwnej: O( V E 15
Algorytm Prima MST-Prim(G, root) for każdego v V do key(v) ; π[v] null key(root) 0; Enqueue(Q,V) while Q nie jest pusty do Zmniejszamy Korzystamy z wartość kolejki priorytetowej klucza u Get-Min(Q) for każdego v sąsiada u do if v Q i w(u,v) < key(v) thenπ[v] u key(v) w(u,v) Zmniejszamy wartość klucza 16
Przykład - algorytm Prima 0 a 4 8 8 7 b c d 11 i 4 14 7 6 h 1 g f 9 10 e koszt: 37 17
Analiza algorytmu Prima Poprawność: wynika bezpośrednio z Twierdzenia 1. Złożoność: zależy od implementacji kolejko priorytetowej, dla kopca binarnego mamy: Budowa początkowego kopca O( V ). Extract-Min zajmuje O(lg V ) dla każdego wierzchołka razem O( V lg V ) Pętla for jest wykonywana w czasie O( E ). Test czy jest sąsiadem zajmuje O(1). Zmniejszanie klucza O(lg V ). Ostatecznie dostajemy: O( V lg V + E lg V ) = O( E lg V ). 18
Podsumowanie: MST MST jest drzewem zawierającym wszystkie wierzchołki o minimalnym koszcie Stosuje się dwa zachłanne algorytmy dla znalezienia MST: Kruskala: oparty o krawędzie. Czas wykonania: O( V E ). Prima: oparty o wierzchołki. Czas wykonania: O( E lg V ). Złożoność dla algorytmu Kruskala można poprawić przez zastosowanie struktur Union-Find do O( E lg V ), Złożoność dla algorytmu Prima można poprawić przez zastosowanie kopców Fibonacciego do O( V lg V + E ). 19