ALGORYTMY I STRUKTURY DANYCH
WYKŁAD 12 Algorytmy na grafach - metoda zachłanna
Grażyna Mirkowska PJWSTK, 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 –
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.
ZASADA ZASADA
„Greedy” algorithmsstyczen 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
Jak znaleźć drzewo rozpinające grafu (1)?
BFS BFS
Włóż 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 e d
f
a b f
c e a
Wynik:
Wynik: ab af bc
f b
c e f
c e d
be e d
cd d
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 6
Jak znaleźć drzewo rozpinające grafu(2)?
DFS DFS
Włóż 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 e d
f
Wynik Wynik:
a
ab b
f
b b
c e
af fc b c d
fe b c
ed
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
1
4
6 7
5
3 2
10 8
4
7 8 7
3 7
4
5 15 6
9
1
4
6 7
5
3 2
10 8
4
7 8 7
3 7
4
5 15 6
9
Jakieś drzewo
rozpinające Minimalne drzewo
rozpinające
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}= V Ti 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żą.
Przykład
5
2
3 4
7 1
6
6
3
15
7 5
7
1
2 4 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| 7 1, 2, 4| 3| 5| 6| 7 1, 2, 3, 4| 5| 6| 7 1, 2, 3, 4, 5| 6| 7 1, 2, 3, 4, 5| 6, 7 1, 2, 3, 4, 5, 6, 7
Kolejka Kolejka Priorytetowa
Priorytetowa 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.
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-Union Find-Union
A B 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.
1
4
6 7
5
3 2
10 8
4
7 8 7
3 7
4
5 15 6
2
Suma kosztów krawędzi leżących na tej drodze jest
najmniejsza
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}.
Przykład
A B
C
D E
F
G
H I
2 5
4 2
4
2
1
1 5 5 6
9
6 1
3
A B C D E F G H I J d
P
A
S1 A S2
F
G
B
0 2 9 5
A A A
S1 A
F
G
B C
6 B
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 18
c.d. przykładu
A B
C
D E
F
G
H I
2 5
4 2
4
2
1
1 5 5 6
9
6 1
3
S1 A
F
G
B S2
C
A B C D E F G H I J d
P
0 2 9 5
A A A
6 B
I
H
G G 10 7
S1 A
F
G
B C
I
H
S2 D
8 C
Cd. przykładu
A B C D E F G H I J d
P
0 2 9 5
A A A
6
B G G
10 7
S1 A
F G
B C
I H
S2 D
8 C
A B
C
D E
F
G
H I
2 5
4 2
4
2
1
1 5 5 6
9
6 1
3
Itd...
styczen 2003 G. Mirkowska, ASD_12 Algorytmy na grafach 20
Algorytm
{x :=s;
While niepusty (S3) do
Dla 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 minimalne x := z;
od}
Koszt Koszt
Algorytmu Algorytmu Dijkstry Dijkstry
O(card(V)2)