Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałIrenka Czupryniak Został zmieniony 10 lat temu
1
Reprezentacja grafów i operacje na grafach na przykładzie algorytmu Dijkstry i algorytmu na odnajdywanie Silnych Spójnych Składowych Temat Opracowali: Adrian Kuczyński Marcin Wiankowski
2
Graf i jego reprezentacje Pojęcie grafu Macierz sąsiedztwa Lista sąsiedztwa Algorytmy Algorytm Dijkstry Algorytm Silnych Spójnych Składowych
4
Graf to – w uproszczeniu – zbiór wierzchołków, które mogą być połączone krawędziami, w taki sposób, że każda krawędź kończy się i zaczyna w którymś z wierzchołków. Ze względu na sposób połączenia wierzchołków grafy dzielimy na : skierowane i nieskierowane. Za pierwszego teoretyka i badacza grafów uważa się Leonarda Eulera, który rozstrzygnął zagadnienie mostów królewieckich. (źródło Wikipedia) Rys1. Graf skierowany (digit)Rys2. Graf nieskierowany Pojęcia: V - oznacza zbiór wierzchołków E - oznacza zbiór krawędzi
5
Wyraz leżący na przecięciu i-tego wiersza i j -tej kolumny informuje o istnieniu krawędzi od wierzchołka i-tego do j-tego, dla grafu ważonego zamiast 1 wpisywana jest waga łączącej je krawędzi Jest macierzą wymiaru V(G) 2 (tyle zajmuje w pamięci RAM O(V 2 )) Stosowana dla grafów gęstych ( E jest bliskie V 2 ) albo w przypadku, gdy istnieje potrzeba szybkiego stwierdzenia czy istnieje krawędź łącząca dane 2 wierzchołki 1 wierzchołek 2 wierzchołek Uwaga: Dla grafów nieskierowanych macierz jest symetryczna względem głównej przekątnej.
6
waga = 2; Dla każdego wierzchołka zapamiętywana jest w tablicy lista sąsiadujących z nim wierzchołków, indeks w tablicy odpowiada liście sąsiedztwa danego wierzchołka Rozmiar zajmowanej przez nią pamięci dla obu typów grafów wynosi O(V+E) Wagi krawędzi są dane przez funkcję wagową w:E->R. Dla przykładu w(1,3) dla krawędzi (1,3) E jest pamiętana z wierzchołkiem 3 (dodatkowe pole) na liście 1. 2 2 3 / / / 2 2 4 / 3 / Uwaga: Ta reprezentacja będzie wykorzystana w algorytmie Dijkstry. waga = 2
8
Algorytm opracowany przez holenderskiego informatyka Edsgera Dijkstrę - odnajduje najkrótsze ścieżki z pojedynczego źródła w grafie o nieujemnych wagach krawędzi.
9
Problem: Dany jest ważony graf skierowany G=(V,E) i wyróżniony wierzchołek v o V, nazywany źródłem; dla każdego wierzchołka v V należy znaleźć najkrótszą ścieżkę z v o do v. Wagą ścieżki jest suma wag tworzących ją krawędzi. Najkrótszą ścieżką jest ścieżka o najmniejszej wadze. vovo 6 3 5 7 11 9 3 5 0 2 1 6 2 4 3 Ważony graf skierowanyDrzewo najkrótszych ścieżek vovo 6 3 5 7 9 3 5 0 2 1 6 2 4 3 11 Uwaga: Może być wiele najkrótszych ścieżek prowadzących do danego wierzchołka.
10
Używane struktury danych: d[v] (tablica) - oszacowanie wagi najkrótszej ścieżki od źródła do v p[v] (tablica) - poprzednik v S – zbiór wierzchołków grafu o policzonych już najkrótszych ścieżkach Q - kolejka priorytetowa zawierająca wierzchołki spoza zbioru S (V - S), priorytetem jest parametr d Initialize-Single-Source(G, v o ) // inicjalizacja grafu w czasie O(V) 1for każdy wierzchołek v V[G] 2do d[v] := 3 [v] := NIL 4d[v o ] := 0
11
Relax(u, v, w) 1if d[v] > d[u] + w(u, v) 2then d[v] := d[u] + w(u, v) 3 [v] := u Relaksacja krawędzi - ewentualne zmniejszenie oszacowania wagi najkrótszej ścieżki d[v] 59 57 2 2 RELAX(u,v,w) Uwaga: Wartości w wierzchołkach to d[v],relaksacja może, ale nie musi zmniejszyć d[v].
12
Dijkstra(G, w, v o ) 1Initialize-Single-Source(G, v o ) 2S := 3Q := V[G] 4while Q 5do u := Extract-Min(Q) 6 S := S {u} 7 for każdy wierzchołek v Adj[u] 8do Relax(u, v, w) Gdzie: S – zbiór z wierzchołkami, dla których wagi najkrótszych ścieżek ze źródła s zostały obliczone Q - kolejka priorytetowa zawierająca wierzchołki spoza zbioru S (V - S) v o – wierzchołek od którego budowane są najkrótsze ścieżki G – graf wejściowy Adj[u] – lista sąsiedztwa wierzchołka u
13
V = {1,2,3,4,5,6} E = {(1-2,3),(1-4,3),(2-3,2),(3-1,6),(3-6,1),(4-5,1),(5-3,1),(5-6,2),(6-4,3)} Będziemy wyznaczać najkrótsze ścieżki pomiędzy wyróżnionym wierzchołkiem (źródłem), a wszystkimi pozostałymi wierzchołkami w grafie.
14
Tworzymy dwa zbiory S (wierzchołki, dla których są policzone najkrótsze ścieżki) oraz Q (wierzchołki jeszcze nie przetworzone). Zbiór S jest początkowo pusty. Zbiór Q obejmuje wszystkie wierzchołki grafu.
15
Dla każdego wierzchołka v ustawiamy d(v). Dla wybranego wierzchołka v o ustawiamy d(v o ) 0. Ustawiamy również p(v) 0.
16
W zbiorze Q szukamy wierzchołka o najmniejszym d - wierzchołek 1 - przenosimy go do zbioru S. Następnie sprawdzamy wartość d jego sąsiadów (wierzchołki 2 i 4). Jeśli ich d jest większe od kosztu d(1) + w(1,v), to modyfikujemy d i p dla tych wierzchołków.
17
W zbiorze Q szukamy wierzchołka o najmniejszym d. Są dwa takie wierzchołki: 2 i 4 o d=3. Wybieramy arbitralnie wierzchołek nr 2 i przenosimy go do zbioru S. Wierzchołek 2 posiada tylko jednego sąsiada - 3. Modyfikujemy odpowiednio d[3] i p[3]
18
W zbiorze Q szukamy wierzchołka o najmniejszym d. Teraz jest to wierzchołek 4 o d[4] = 3. Przenosimy go do zbioru S. Wierzchołek 4 posiada tylko jednego sąsiada - 5. Modyfikujemy odpowiednio d[5] i p[5].
19
W zbiorze Q szukamy wierzchołka o najmniejszym d. Jest to wierzchołek 5 o d[5] = 4. Przenosimy go do zbioru S. Wierzchołek 5 posiada dwóch sąsiadów: 3 i 6. Ponieważ d[3]=5 jest takie samo jak d[5] + waga(5-3) = 4+1=5, nie modyfikujemy parametrów d i p dla wierzchołka 3. Do modyfikacji jest tylko wierzchołek 6.
20
W zbiorze Q szukamy wierzchołka o najmniejszym d. Jest to wierzchołek 3 o d[3] = 5. Przenosimy go do zbioru S. Wierzchołek 3 posiada dwóch sąsiadów: 1 i 6. Ponieważ wierzchołek 1 jest już w zbiorze S, to nie bierzemy go pod uwagę. Drugi wierzchołek posiada d[6]=6, czyli takie samo jak d[3]+waga(3-6)=5+1=6. Nie modyfikujemy zatem wierzchołka 6.
21
Do zbioru S przenosimy ostatni wierzchołek z Q. Wierzchołek ten nie posiada sąsiadów w Q połączonych z nim krawędzią, dlatego nic nie modyfikujemy. Ponieważ zbiór Q stał się pusty, algorytm kończymy.
22
wykorzystując "naiwną" implementację poprzez zwykłą tablicę, otrzymujemy algorytm o złożoności O(V 2 ) Złożoność obliczeniowa algorytmu Dijkstry zależy od liczby V wierzchołków i E krawędzi grafu. O rzędzie złożoności decyduje implementacja kolejki priorytetowej: w implementacji kolejki poprzez kopiec, złożoność wynosi O(ElogV) po zastąpieniu zwykłego kopca kopcem Fibonacciego, złożoność zmniejsza się do O(E + VlogV) Uwaga: Pierwszy wariant jest optymalny dla grafów gęstych, drugi jest szybszy dla grafów rzadkich, trzeci jest bardzo rzadko używany ze względu na duży stopień skomplikowania i niewielki w porównaniu z nim zysk czasowy.
23
Algorytm zachłanny (ang. greedy algorithm) – algorytm, który w celu wyznaczenia rozwiązania w każdym kroku dokonuje zachłannego, tj. najlepiej rokującego w danym momencie wyboru rozwiązania częściowego. Innymi słowy algorytm zachłanny, dokonuje decyzji lokalnie optymalnej, dokonuje on wyboru wydającego się w danej chwili najlepszym, kontynuując rozwiązanie podproblemu wynikającego z podjętej decyzji. (źródło Wikipedia)ang.
24
Programy do nawigacji – np. Automapa Przesyłanie pakietów internetowych – routing W grach komputerowych – wyznaczanie trasy komp. przeciwnika I wiele innych.
26
DZIĘKUJEMY ZA UWAGĘ ;-) Mamy nadzieję, nasza prezentacja pokazała jak wielki potencjał mają omówione algorytmy i graf jako struktura danych, która umożliwia rozwiązanie dosyć skomplikowanych problemów.
27
http://wikipedia.pl http://edu.i-lo.tarnow.pl Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford Wprowadzenie do algorytmów
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.