Złożoność obliczeniowa algorytmów grafowych
Transkrypt
Złożoność obliczeniowa algorytmów grafowych
Złożoność obliczeniowa klasycznych problemów grafowych Oznaczenia: G – graf, V – liczba wierzchołków, E – liczba krawędzi 1. Spójność grafu Graf jest spójny jeżeli istnieje ścieżka łącząca każdą parę jego wierzchołków. Spójność grafu można zbadać za pomocą algorytmu przeszukiwania w głąb (DFS, ang. depth-first search), który dla reprezentacji grafu w postaci listy sąsiedztwa ma złożoność liniową proporcjonalną do sumy wierzchołków i krawędzi O(V+E). W przypadku reprezentacji grafu w postaci macierzy sąsiedztwa algorytm DFS ma złożoność kwadratową względem liczby wierzchołków O(V2). Metoda DFS Rekurencyjnie przeszukujemy graf. Odwiedzając wierzchołek zaznaczamy, że został już odwiedzony, a następnie rekurencyjnie odwiedzamy wszystkie sąsiednie wierzchołki, które nie zostały oznaczone jako odwiedzone. 2. Ścieżka Eulera Ścieżka Eulera to ścieżka łącząca dwa dane wierzchołki, która przebiega przez każdą krawędź w grafie dokładnie raz. Jeżeli jest taka potrzeba, to przez wierzchołki można przechodzić wielokrotnie. Jeżeli wierzchołek końcowy pokrywa się z początkowym, to mówimy o trasie Eulera. Problem został sformułowany po raz pierwszy przez Leonarda Eulera w 1736 roku, a jego szczególny przypadek nie mający rozwiązania, to tzw. problem 7 mostów królewieckich. Rozwiązanie trasy i ścieżki Eulera warunkują następujące własności. Graf posiada cykl (trasę) Eulera, jeżeli jest spójny i wszystkie jego wierzchołki mają parzysty stopień (parzystą ilość krawędzi przylegających do wierzchołka). Graf posiada ścieżkę Eulera, jeżeli jest spójny i dokładnie dwa jego wierzchołki mają nieparzysty stopień. Stopień wierzchołka Vi oznaczamy jako deg(Vi). Jeżeli istnieje cykl Eulera to możemy go wyznaczyć w czasie liniowym O(E). 3. Ścieżka Hamiltona Ścieżka Hamiltona to ścieżka w grafie łącząca dwa dane wierzchołki, która przebiega przez każdy wierzchołek w grafie dokładnie jeden raz. Jeżeli wierzchołek końcowy pokrywa się z początkowym, to mówimy o trasie (cyklu) Hamiltona. Wyznaczenie ścieżki Hamiltona w sposób rekurencyjny wymaga czasu wykładniczego O(V!) i jest to problem NP-zupełny. Rozszerzeniem problemu Hamiltona jest problem komiwojażera (TSP, ang. traveling salesman problem). Polega on na znalezieniu minimalnego cyklu Hamiltona w pełnym grafie ważonym. Nazwa wzięła się stąd, że wierzchołki interpretujemy jako miasta, a wagi krawędzi jako odległości między miastami. Jest to także klasyczny problem NP-zupełny. 4. Dopasowanie Problem polega na wyznaczeniu możliwie największego podzbioru krawędzi grafu, mających tę własność, że żadne dwie spośród krawędzi nie prowadzą do/od tego samego wierzchołka. Rozwiązanie tego problemu wymaga czasu proporcjonalnego do wielomianu zależnego od ilości wierzchołków i krawędzi O(p(V,E)). Dopasowanie dwudzielne (graf dwudzielny) Problem j/w, ale mamy dwa różne typy wierzchołków i wyszukujemy tylko te krawędzie, które łączą wierzchołek pierwszego typu z wierzchołkiem drugiego typu. 5. Planarność Czy możemy narysować dany graf, bez wzajemnego przecinania się krzywych reprezentujących jego krawędzie? Wyjaśnia to Twierdzenie Kuratowskiego (1930): Graf jest planarny, jeżeli po zredukowaniu wierzchołków stopnia 2 nie zawiera podgrafu pełnego o pięciu wierzchołkach (graf 5), ani podgrafu pełnego dwudzielnego o sześciu wierzchołkach, w którym każdy z trzech wierzchołków w pierwszej grupie jest połączony z każdym z wierzchołków w drugiej grupie (graf 3,3). graf 5 graf 3,3 Innymi słowy można to ująć: graf jest planarny wtedy i tylko wtedy, gdy nie zawiera podgrafu, który można otrzymać z grafów graf 5 i graf 3,3 przez podział krawędzi wierzchołkami o stopniu 2. Graf homeomorficzny (podobny) to graf, który można otrzymać z danego grafu wstawiając w krawędziach dodatkowe wierzchołki stopnia 2. Bezpośrednia implementacja ma złożoność wielomianową O(n6). Tarjan i Hopcroft w 1971 podali algorytm o złożoności O(n log(n)). A w 1974 przedstawili zawiłą wersję o złożoności liniowej O(n). ”Najładniejszy” graf planarny w 1994 roku 6. Maksymalna klika Jaki jest rozmiar największego podgrafu pełnego w grafie (kliki)? (podgraf pełny – podzbiór wierzchołków grafu wraz z krawędziami pomiędzy tymi wierzchołkami tworzący graf, w którym każdy wierzchołek jest połączony ze wszystkimi pozostałymi). Jest to problem klasy NP. 7. Kolorowanie grafu Problem polega na rozstrzygnięciu, czy istnieje taki sposób przypisania jednego z k kolorów każdemu wierzchołkowi w grafie tak, aby każda para wierzchołków, połączonych wspólną krawędzią miała różne kolory. Liczbą chromatyczną grafu nazywamy najmniejszą możliwą liczbę kolorów potrzebnych do pokolorowania wierzchołków w w/w sposób. Dwukolorowalność Problem rozstrzygamy dla k=2, czyli dla dwóch kolorów. Problem ten jest równoważny problemowi sprawdzania, czy graf jest dwudzielny. Graf dwudzielny – graf, którego zbiór wierzchołków można podzielić na dwa rozłączne zbiory tak, że krawędzie nie łączą wierzchołków tego samego zbioru. Problem ten może być rozwiązywany z zastosowaniem metody przeszukiwania grafu wszerz (BFS, ang. breadth-first search), która dla reprezentacji grafu w postaci listy sąsiedztwa ma złożoność O(V+E), a w przypadku reprezentacji grafu w postaci macierzy sąsiedztwa O(V2). Metoda BFS Wykorzystuje się strukturę danych typu kolejka (FIFO). Zdejmując ze stosu wierzchołek umieszczamy na stosie wszystkie jego sąsiednie nieodwiedzone wierzchołki. Odwiedzone wierzchołki zaznaczamy. Trójkolorowalność Problem sformułowany jak w dwukolorowalności, ale wierzchołkom przypisujemy jeden z trzech kolorów. Problem potrafimy rozwiązywać tylko algorytmami siłowymi, czyli ma złożoność wykładniczą O(3V) i jest NP-zupełny. Używając programowania dynamicznego, uzyskujemy złożoność obliczeniową O(2,445V). Znane są także szybsze algorytmy o złożoności O(V2V), O(1,7504V) i O(1,3289V). Programowanie dynamiczne Jest przykładem programowania wstępującego, polegającego na rozwiązywaniu kolejnych coraz większych realizacji problemu, aż do osiągnięcia realizacji koocowej. Najpierw rozwiązywane są najmniejsze realizacje problemu, otrzymane wyniki są zapamiętywane, a potem są wykorzystywane przy rozwiązywaniu coraz to większych realizacji problemu (bez potrzeby ich ponownego wielokrotnego wyliczania). Algorytmy programowania dynamicznego na ogół opisuje się w postaci iteracyjnej. Czterokolorowalność Twierdzenie o czterech kolorach: Każdy graf planarny jest czterokolorowalny Po raz pierwszy hipoteza o prawdziwości tego twierdzenia została postawiona w roku 1852. Jednakże dowód przedstawiono dopiero ponad sto lat później w 1976 roku. Dowód opiera się niestety na sprawdzeniu aż 1936 przypadków szczególnych, a wykonać to można tylko przy pomocy komputera. Dlatego z dowodem czekano, aż do czasów komputerów o wystarczających mocach obliczeniowych. Nikt dotąd nie udowodnił twierdzenia o czterech barwach bez komputerowego wspomagania, choć wymyślono pewne uproszczenia oryginalnego dowodu. 8. Najkrótsza ścieżka Problem wyznaczania wierzchołkami. w grafie ważonym najkrótszej ścieżki między dwoma Istnieją dwa klasyczne algorytmy: Dijkstry: Wyznaczana jest najkrótsza ścieżka pomiędzy danym wierzchołkiem, a wszystkimi wierzchołkami w grafie. Algorytm Dijkstry jest przykładem algorytmu zachłannego. Algorytm zachłanny Algorytm, w którym w celu uzyskania rozwiązania problemu w każdym kroku dokonuje się wyboru najlepiej rokującego w danym momencie rozwiązania częściowego, tzn. wybieramy zachłannie. Najprostsza implementacja – złożoność obliczeniowa O(V2). Gdy graf ma dużo mniej krawędzi niż graf pełny stosuje się kolejkę priorytetową zrealizowana w postaci kopca binarnego – złożoność obliczeniowa wynosi wtedy O(E logV). Złożoność można jeszcze polepszyć do wartości O(V logV+E) (stosuje się wtedy kopiec Fibonacciego). Algorytm Dijkstry Algorytm korzysta z węzłów oznaczanych jako nieosiągalne, nieustalone i ustalone. W kolejnych krokach algorytmu obliczenia odległości wykonuje się tylko dla węzłów nieustalonych i nieosiągalnych. Wagi krawędzi muszą byd dodatnie. 1. Na początku wszystkie wierzchołki są oznaczone jako nieosiągalne z wierzchołka początkowego. 2. Zaczynamy od oznaczenia wierzchołka początkowego jako ustalonego. Dla wszystkich wierzchołków połączonych z nim obliczamy ich odległości od tego wierzchołka, a następnie wierzchołek o minimalnej odległości oznaczamy jako ustalony. 3. W następnym kroku dla wszystkich wierzchołków sąsiadujących z aktualnym wierzchołkiem ustalonym obliczamy ich odległości od wierzchołka początkowego (liczone poprzez aktualny wierzchołek ustalony). Jeżeli dla któregoś z wierzchołków odległośd ta jest mniejsza niż dotychczasowa, to ją uaktualniamy. 4. Spośród wierzchołków nieustalonych wyszukujemy wierzchołek o minimalnej odległości od wierzchołka początkowego i czynimy go aktualnym wierzchołkiem ustalonym. 5. Powtarzamy kroki 3 i 4 aż do osiągnięcia wierzchołka koocowego i oznaczenia go jako wierzchołek ustalony (mamy wtedy wyznaczoną najkrótszą drogę do tego wierzchołka) lub po ustawieniu wszystkich wierzchołków jako ustalonych (mamy wtedy wyznaczoną najkrótszą drogę do wszystkich wierzchołków w grafie). krok 0 1 2 3 4 5 6 7 8 A N 0(*) 0* 0* 0* 0* 0* 0* 0* B N 16 15min 15(*) 15* 15* 15* 15* 15* C N 7min 7(*) 7* 7* 7* 7* 7* 7* D N 21 21 21 20min 20(*) 20* 20* 20* E N N 15 15min 15(*) 15* 15* 15* 15* F N N N N 25 24 24min 24(*) 24* G N N N 27 23 23min 23(*) 23* 23* H N N N N N N 32 31min 31(*) Bellmana-Forda: pesymistyczna złożoność obliczeniowa O(VE). Stosuje się także dwa algorytmy wyznaczające najkrótsze ścieżki pomiędzy wszystkimi parami wierzchołków: Floyda-Warshalla: pesymistyczna złożoność obliczeniowa O(V3). Algorytm Floyda-Warshalla Algorytm wyznacza minimalne odległości pomiędzy wszystkimi parami wierzchołków w grafie. W tym algorytmie wagi węzłów mogą byd ujemne, ale nie może jednak występowad cykl o łącznej ujemnej wadze osiągalny ze źródła. Działanie algorytmu jest następujące: 1. Po kolei rozpatrujemy kolejne wierzchołki grafu jako elementy centralne c. 2. Dla każdej pary wierzchołków u i v, jeżeli suma etykiet krawędzi u-c i c-v jest mniejsza od wartości etykiety krawędzi u-v, to w macierzy sąsiedztwa reprezentującej graf zamieniamy tą etykietę na etykietę będącą sumą etykiet krawędzi u-c i c-v. Johnsona: pesymistyczna złożoność obliczeniowa O(V2 log(V)+VE). 9. Najdłuższa ścieżka Problem wyznaczania wierzchołkami. w grafie ważonym najdłuższej ścieżki między dwoma Podobieństwo tego problemu do problemu najkrótszej ścieżki jest tylko pozorne. Problem ten jest wersją problemu trasy Hamiltona, czyli jest to problem NP-zupełny. 10. Silna spójność Czy istnieje ścieżka skierowana łącząca każdą parę wierzchołków w grafie skierowanym? Złożoność obliczeniowa jest liniowa względem sumy wierzchołków i krawędzi O(V+E) (dwukrotne wykonanie algorytmu spójności dla grafu nieskierowanego). Problem ten redukuje się do problemu spełnialności formuł logicznych w postaci 2SAT, co oznacza, że problem 2SAT jest problemem klasy P. 11. Cykl nieparzystej długości Czy dany graf skierowany posiada cykl o nieparzystej długości? Problem ten jest równoważny problemowi dwukolorowalności, a więc ma złożoność wielomianową. Graf niezawierający cykli nieparzystej długości jest dwukolorowalny. 12. Cykl parzystej długości Czy dany graf skierowany posiada cykl o parzystej długości? Problem ten jest równoważny problemowi dwudzielności, a więc ma złożoność wielomianową. W grafie dwudzielnym wszystkie cykle są parzyste. 13. Minimalne drzewo rozpinające Minimalne drzewo rozpinające definiuje się dla grafu ważonego nieskierowanego jako zbiór wszystkich wierzchołków grafu oraz podzbiór jego krawędzi spełniające trzy warunki: krawędzie łączą wszystkie wierzchołki grafu w grafie nie występują cykle suma etykiet krawędzi jest minimalna Algorytm Kruskala - wyznaczanie minimalnego drzewa rozpinającego Algorytm polega na łączeniu minimalnych drzew rozpinających. Przeglądamy kolejne krawędzie grafu w kolejności rosnących wartości etykiet. Jeżeli wierzchołki kolejnej rozważanej krawędzi należą do dwóch różnych drzew, to krawędź tą dołączamy do minimalnego drzewa rozpinającego, w przeciwnym razie (wierzchołki znajdują się w obrębie jednego drzewa) – nie dołączamy. Algorytm Kruskala: złożoność obliczeniowa O(E log (E)) Stosuje się także dwa algorytmy wyznaczające minimalne drzewo rozpinające: Prima: złożoność obliczeniowa O(E log(V)). Boruvki: złożoność obliczeniowa O(E log(V) log(E)). Tab. Złożoności obliczeniowe klasycznych problemów grafowych rodzaj grafu rodzaj problemu grafy nieskierowane spójność ścieżka Eulera ścieżka Hamiltona dopasowanie dwudzielne dopasowanie maksymalne planarność maksymalna klika 2-kolorowalność 3-kolorowalność najkrótsza ścieżka najdłuższa ścieżka grafy skierowane silna spójność cykl nieparzystej długości cykl parzystej długości grafy ważone minimalne drzewo rozpinające problem komiwojażera problemy problemy problemy P łatwe P trudne NP-zupełne