(U, V–U).
Transkrypt
(U, V–U).
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. 24 2 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) 8 b 7 c d 4 9 2 11 a i 7 14 4 e 6 8 10 h 1 g 2 f koszt: 51 4 Przykład drzewa rozpinającego (minimalne) 8 b 7 c d 4 9 2 11 a i 7 14 4 e 6 8 10 h 1 g 2 f 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 : w (T ) = w (u ,v ) ∑ ( ) u ,v ∈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ł U 8 b 7 c V–U d 4 9 2 11 a i 7 14 4 e 6 8 10 h 1 g 2 f 9 Własności MST Twierdzenie 2: 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. V T V–U U 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 = (VC, EC) będzie składową (drzewem) w lesie GA = (V,A). Jeśli e jest lekką krawędzią łączącą C z pewną inną składową w GA, wtedy e jest bezpieczne dla A. Dowód: przekrój (VC, V–VC) 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. 2). 2. 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). 12 Algorytm Kruskala MST-Kruskal(G) A∅ for każdy wierzchołek v∈ ∈V do Każdy wierzchołek staje się osobnym drzewem Make-Set(v) posortuj krawędzie z E niemalejąco względem wag for każda krawędź e = (u,v)∈ ∈E do if Find-Set(u) ≠ Find-Set(v) Drzewa są rozdzielone then A A ∪ {e} Union(u,v) return A Łączymy drzewa 13 Przykład – alg. Kruskala 8 b 7 c d 4 9 2 11 a i 7X 8X 14 4 e X6 10 h 1 g 2 f koszt: 37 14 Analiza – alg. Kruskala Poprawność: wynika wprost z Tw. 2. 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 Zmniejszamy Korzystamy zwartość kolejki priorytetowej klucza key(root) 0; Enqueue(Q,V) while Q nie jest pusty do u Get-Min(Q) for każdego v sąsiada u do if v∈ ∈Q i w(u,v) < key(v) then π[v] u Zmniejszamy wartość klucza key(v) w(u,v) 16 Przykład - algorytm Prima ∞ 8 b 0 4 ∞ 11 a ∞ c d 9 2 i 7 7 ∞ 14 4 ∞ e 6 8 10 h ∞ 1 g ∞ 2 f ∞ 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