ALGORYTMY I STRUKTURY DANYCH
description
Transcript of ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
WYKŁAD 12 Algorytmy na grafach - metoda zachłanna
Grażyna MirkowskaPJWSTK, 2002/2003
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 2
Plan wykładu
Idea algorytmów zachłannych Problem drzew rozpinających
– Chodzenie po grafie ze stosem i kolejką– Algorytm Kruskala
Problem najkrótszych ścieżek– Algorytm Dijkstry –
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 3
Na czym to polega?
W każdym kroku, w którym trzeba dokonać wyboru, wybierać zawsze rozwiązanie lokalnie optymalne, takie które w danym momencie działania algorytmu jest najlepsze.
ZASADAZASADA„Greedy” algorithms
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 4
Drzewa rozpinające
Niech G będzie dowolnym grafem niezorientowanym <V, E>.
Drzewem rozpinającym grafu G = <V, E> nazywamy graf G* =<V*, E*> taki, że
(1) V* = V, E* E(2) G* jest drzewem (tzn. graf spójny i acykliczny).
Graf i jego drzewa rozpinające
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 5
Jak znaleźć drzewo rozpinające grafu (1)?
BFSBFSWłóż do kolejki wybrany wierzchołek grafu i zamarkuj go.
Dopóki kolejka nie jest pusta
1. Weź pierwszy element z kolejki i dopisz do kolejki wszystkie wierzchołki z nim incydentne o ile nie były zamarkowane i zamarkuj je.
2. Wypisz krawędzie odpowiadające dopisanym wierzchołkom.3. Usuń pierwszy element z kolejki.
a b
c
de
f
a b fc e
a
Wynik:Wynik: ab af bc
fbc efc e d
bee d
dcd
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 6
Jak znaleźć drzewo rozpinające grafu(2)?
DFSDFSWłóż na stos wybrany wierzchołek grafu i zamarkuj go.
Dopóki stos nie jest pusty :
1. Weź element ze szczytu stosu.
2 . Usuń ze stosu ten element .
3. Dopisz do stosu wszystkie wierzchołki z nim incydentne, których jeszcze nie zamarkowano, a dopisane wierzchołki zamarkuj.
4. Wypisz krawędzie odpowiadające dopisanym wierzchołkom.
a b
c
de
f
WynikWynik:
a
ab
bf
bbce
af fc
bcd
fe
bc
ed
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 7
Minimalne drzewo rozpinające
Niech będzie dany graf G = <V, E> spójny niezorientowany, skończony i niech c : E R+ będzie funkcją kosztu określoną na krawędziach tego grafu.
Problem Problem Dla danego skończonego grafu G oraz danej funkcji kosztu c, znaleźć minimalne drzewo rozpinające, tzn. takie drzewo <V, T> rozpinające grafu G, że suma kosztów jego krawędzi eT c (e) jest najmniejsza.
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 8
Przykład: sieć wodociągowa
14
6
75
3
210
8
4
87
7
3 74
515
6
9
14
6
75
3
210
8
4
87
7
3 74
515
6
9
Jakieś drzewo rozpinające
Minimalne drzewo rozpinające
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 9
Lemat
Niech G = <V, E> będzie grafem spójnym skończonym i nich c będzie jego funkcją kosztu.
Niech d1= <V1, T1>, d2= <V2, T2>,......, dk = <Vk, Tk>
będzie danym lasem rozpinającym G
{Vi: 1 i k}= VTi E dla 1 i k Vi Vj = dla i j
di - drzewo
Niech e = (v,w) będzie krawędzią o minimalnym koszcie, która nie należy do żadnego z drzew di.
Nie istnieje drzewo rozpinające <V,T*> grafu G, takie że e T* oraz <V, T*> ma najmniejszy koszt wśród drzew rozpinających zawierających wszystkie Ti.
Vi v
w
w’
v’
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 10
Algorytm Kruskala
Utworzyć kolejkę priorytetową PQ z wszystkimi krawędziami grafu, uporządkowanymi ze względu na koszt.
Utworzyć początkowy podział Po zbioru V (tzn. rodzinę jednoelementowych zbiorów {x}, gdzie x V}.
Przeglądać kolejno elementy kolejki i jeżeli końce rozważanej krawędzi należą do różnych zbiorów podziału, to krawędź dołączamy do tworzonego drzewa, a zbiory podziału łączymy.
Jeśli drzewo rozpinające ma mieć koszt minimalny i ma zawierać dany las drzew , to musi też zawierać krawędź e o minimalnym koszcie wsród krawędzi, które do tego lasu nie należą.
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 11
Przykład
5
2
3
4
7
1
6
6
3
15
75
71
42
8
10
1. (1,2)
2. (1,4)
3.(2,3)
4. (1,3)
5.(4,5)
6. (3,5)7. (1,5)7. (6,7)
8. (1,6)
10. (7,4)15. (4,3)
1| 2| 3| 4| 5| 6| 7
1, 2| 3| 4| 5| 6| 71, 2, 4| 3| 5| 6| 71, 2, 3, 4| 5| 6| 71, 2, 3, 4, 5| 6| 7
1, 2, 3, 4, 5| 6, 7
1, 2, 3, 4, 5, 6, 7Kolejka Kolejka
PriorytetowaPriorytetowa PodziałPodział+
++
+
+
+
+
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 12
Algorytm
Zakładam, że 1. pq jest kolejką priorytetową wszystkich krawędzi danego grafu G = <V, E>,
2. P jest początkowym podziałem zbioru V, 3. T pustym stosem (będą tam krawędzie drzewa).
{ while (not empty (pq) and card(P)>1) do kr := min(pq); pq := delmin(pq); A := Find(P,kr.początek); B := Find(P,kr.koniec); if A B then P := Union(P,B,A); T := push(T,kr) fi od }
Find (P,x) = ten zbiór podziału P do którego
należy x
Union(P,B,A) = podział powstający z P przez
połączenie zbiorów A i B.
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 13
Jak to zaimplementować?
Koszt utworzenia kolejki priorytetowej – O(m lg m)
Koszt 2m operacji Find O(lg(n))Koszt m operacji Union O(1)
Razem Razem O(m lg n)
Drzewa z balansowaniem i kompresją ścieżek
Struktura Struktura Find-UnionFind-Union
BA A A
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 14
Problem ścieżek
Dany jest graf G = <V, E> i jego funkcja kosztu c : E R +.
Znaleźć najkrótsze drogi od ustalonego wierzchołka (źródła) do wszystkich innych wierzchołków.
14
6
75
3
210
8
4
87
7
3 74
515
6
2
Suma kosztów krawędzi leżących na tej drodze jest
najmniejsza
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 15
Metoda Dijkstry
W kolejnych etapach algorytmu zbiór wierzchołków osiągalnych ze źródła jest powiększany o wierzchołki incydentne z ostatnio dołączonymi.
Zawsze staramy się by dołączać te wierzchołki, których osiągnięcie wymaga najmniejszego kosztu (które znajdują się „najbliżej” zbioru już wcześniej wybranych wierzchołków.
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 16
Struktura danych
Tablica d (1: n) d[i] = długość najkrótszej ścieżki miedzy źródłem a wierzchołkiem i Na początku d[i] = c(s,i) jeśli (s,i) E,
d[i] = + w p.p.Tablica P(1:n) P[i] = ojciec wierzchołka i na najkrótszej ścieżce od s do i.
Zbiór wierzchołków S1 osiągalnych z s.
Zbiór S2 wierzchołków osiągalnych z S1, S2 = {y : istnieje x S1, że (x,y) E}.
Zbiór wierzchołków S3, których jeszcze nie sklasyfikowano.
Na początku S1 = {s}.
Na początku S3 = V-{s}.
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 17
Przykład
A B
C
DE
F
G
HI
2 5
4
2
4
2
1
1
5
659
6
1
3
A B C D E F G H I JdP
AS1 A
S2
FG
B
0 2 9 5A A A
S1 A
FG
B C
6B
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 18
c.d. przykładu
A B
C
DE
F
G
HI
2 5
4
2
4
2
1
1
5
659
6
1
3
S1 A
F
G
BS2
C
A B C D E F G H I JdP
0 2 9 5A A A
6B
I
H
GG10 7
S1 A
F
G
B C
I
H
S2
D
8C
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 19
Cd. przykładu
A B C D E F G H I JdP
0 2 9 5A A A
6B GG
10 7
S1 A
F
G
B C
I H
S2
D
8C
A B
C
DE
F
G
HI
2 5
4
2
4
2
1
1
5
659
6
1
3
Itd.............
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 20
Algorytm
{x :=s;While niepusty (S3) doDla wszystkich wierzchołków y incydentnych z x do case y S2 if d(x) +c(x,y) <d(y) then P(y) := x; d(y) := d(x) +c(x,y) fi ; case y S3 S3 := S3 –{y}; S2 := S2 +{y}; P(y) := x; d(y) := d(x) +c(x,y);od;Wybierz taki element w zb. S2, że d(z) jest minimalnex := z;od}
Koszt Koszt Algorytmu Algorytmu DijkstryDijkstry
O(card(V)2)