• Nie Znaleziono Wyników

ALGORYTMY I STRUKTURY DANYCH

N/A
N/A
Protected

Academic year: 2021

Share "ALGORYTMY I STRUKTURY DANYCH"

Copied!
20
0
0

Pełen tekst

(1)

ALGORYTMY I STRUKTURY DANYCH

WYKŁAD 12 Algorytmy na grafach - metoda zachłanna

Grażyna Mirkowska PJWSTK, 2002/2003

(2)

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

(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.

ZASADA ZASADA

„Greedy” algorithms

(4)

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

(5)

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

(6)

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

(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  eT c (e) jest najmniejsza.

(8)

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

(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}= 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’

(10)

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żą.

(11)

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ł

+

+ + + +

+ +

(12)

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.

(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-Union Find-Union

A B A A

(14)

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

(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.

(16)

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}.

(17)

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

(18)

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

(19)

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...

(20)

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)

Cytaty

Powiązane dokumenty

WYKŁAD 08 Drzewa binarnych poszukiwań Grażyna Mirkowska.. PJWSTK, semestr

Zadanie Do zbioru reprezentowanego przez drzewo D dołączyć element e, o ile nie należy on jeszcze do etykiet drzewa D.... Zastosowanie: wyszukiwanie

(3) Jeżeli tak otrzymane drzewo nie jest częściowo uporządkowane, to przechodząc wzdłuż drogi od liścia x do korzenia, poprawić etykiety zamieniając etykietę ojca z

Jeśli element e należy do kolejki q, to po skończonej liczbie usunięć kolejnych elementów minimalnych.. dotrę do tego

Niech będzie tekst 100000 znakowy, w którym występują tylko litery a,b,c,d,e,f i a-45tys razy, b-13tys., c-12tys.,.. d-16tys., e -

Powiemy, że problem jest rozstrzygalny, jeśli istnieje algorytm, który dla dowolnych danych x po skończonej liczbie kroków daje rozwiązanie problemu. W przeciwnym

Dowód przez indukcję ze względu na liczbę wywołań rekurencyjnych funkcji min_max.. Dla jednego tylko wywołania

Problem Dany jest ciąg rosnący e[1],..,e[n] oraz element x pewnej przestrzeni liniowo uporządkowanej &lt;E, &gt;. Następnie porównujemy x z kolejnymi elementami ciągu