Professional Documents
Culture Documents
Norbert Jankowski
Katedra Informatyki Stosowanej
www.is.umk.pl/norbert/algorytmy
NJ (KIS) Algorytmy 1 / 222
Literatura
Literatura I
A. V. Aho, J. E. Hopcroft, J. D. Ullman.
Projektowanie i analiza algorytmw.
Helion, Warszawa, 2003.
A. V. Aho, J. E. Hopcroft, J. D. Ullman.
Projektowanie i analiza algorytmw.
Pastwowe Wydawnictwa Naukowe, Warszawa, 1983.
Niklaus Wirth.
Algorytmy + Struktury Danych = Programy.
Wydawnictwa NaukowoTechniczne, Warszawa, wydanie 2, 1989.
T. H. Cormen, C. E. Leiserson, R. L Rivest.
Wprowadzenie do algorytmw.
Wydawnictwa NaukowoTechniczne, Warszawa, 1997.
NJ (KIS) Algorytmy 2 / 222
Literatura
Literatura II
A. V. Aho, J. D. Ullman.
Wykady z informatyki z przykadami w jzyku C.
Helion, Warszawa, 2003.
L. Banachowski, K. Diks, W. Rytter.
Algorytmy i struktury danych.
Wydawnictwa NaukowoTechniczne, Warszawa, 1996.
M. M. Syso, N. Deo, J. Kowalik.
Algorytmy optymalizacji dyskretnej.
Pastwowe Wydawnictwa Naukowe, Warszawa, 1993.
D. Harel.
Rzecz o istocie informatyki. Algorytmika.
Wydawnictwa NaukowoTechniczne, Warszawa, 1992.
NJ (KIS) Algorytmy 3 / 222
Literatura
Literatura III
L. Banachowski, A. Kreczmar, W. Rytter.
Analiza algorytmw i struktur danych.
Wydawnictwa NaukowoTechniczne, Warszawa, 1989.
L. Banachowski, A. Kreczmar.
Elementy analizy algorytmw.
Wydawnictwa NaukowoTechniczne, Warszawa, 1982.
D. E. Knuth.
Sztuka Programowania, wolumen IIII.
Wydawnictwa NaukowoTechniczne, 2002.
NJ (KIS) Algorytmy 4 / 222
Algorytmy z powrotami
Algorytmy z powrotami
Automatyczne rozwizywanie problemw, gdzie nie ma (prostych)
rozwiza analitycznych.
Podzia na pod-zadania + metoda prb i bdw.
Bardzo czsto rekurencja.
Niestety najczciej zoono eksponencjalna . . .
NJ (KIS) Algorytmy 5 / 222
Algorytmy z powrotami Skoczek
Drogi skoczka szachowego
3 2
4 1
S
5 8
6 7
Skoczek (ko) porusza si zgodnie z reguami gry w szachy
Start z ustalonej pozycji
Zadanie odwiedzi kad pozycj dokadnie jeden raz
Zagadnienie mona zamieni na prb wykonania kolejnego ruchu
skoczkiem, jeli to tylko moliwe.
NJ (KIS) Algorytmy 6 / 222
Algorytmy z powrotami Skoczek
1 procedure PrbujNastpnyRuch
2 begin
3 zapocztkuj wybieranie ruchw;
4 repeat
5 wybierz nastpnego kandydata z listy ruchw;
6 if dopuszczalny then
7 begin zapisz ruch
8 if na szachownicy wolne pola then
9 begin PrbujNastpnyRuch
10 if nieudany then wykrel ostatni ruch
11 end
12 end
13 until ruch by udany OR nie ma nastpnego kandydata;
14 end
NJ (KIS) Algorytmy 7 / 222
Algorytmy z powrotami Skoczek
Zapamitujmy w macierzy h numery krokw wydawanych przez
skoczka
1 var h : array [1.. n ,1.. n] of integer;
h[x, y] = 0 pole nieodwiedzone
h[x, y] = i pole odwiedzone w i -tym kroku
Musimy mie moliwo przekazywania informacji o zewntrznych
wywoaniach. Czy ruch si powid? Bdziemy to robi poprzez
zmienn q (true=sukces)
Czy ruch jest dopuszczalny? = 1 u, v n AND h[u, v] = 0,
u,v - nowa pozycja skoczka
Czy s wolne pola? = i < n
2
NJ (KIS) Algorytmy 8 / 222
Algorytmy z powrotami Skoczek
1 procedure Prbuj(i:integer; x, y: integer; var q:boolean);
2 var u,v: integer;
3 begin zapocztkuj wybieranie ruchw;
4 repeat u, v wsprzdne nastpnego ruchu;
5 if (1<=u<=n) AND (1<=v<=n) AND (h[u,v]=0) then
6 begin h[u,v]:=i ;
7 if i <nn then
8 begin Prbuj(i+1, u,v, q);
9 if NOT q then h[u,v]:=0;
10 end
11 else q:=true;
12 end
13 until q OR nie ma nastpnego kandydata;
14 end
NJ (KIS) Algorytmy 9 / 222
Algorytmy z powrotami Skoczek
3 2
4 1
S
5 8
6 7
1 a[1]:= 2; b[1]:= 1;
2 a[2]:= 1; b[2]:= 2;
3 a[3]:=1; b[3]:= 2;
4 a[4]:=2; b[4]:= 1;
5 a[5]:=2; b[5]:=1;
6 a[6]:=1; b[6]:=2;
7 a[7]:= 1; b[7]:=2;
8 a[8]:= 2; b[8]:=1;
NJ (KIS) Algorytmy 10 / 222
Algorytmy z powrotami Skoczek
1 procedure Prbuj(i:integer; x, y: integer; var q:boolean);
2 var u,v, k:integer;
3 begin k:=0;
4 repeat k:=k+1;
5 u:=x+a[k]; v:=y+b[k];
6 if (1<=u<=n) AND (1<=v<=n) AND (h[u,v]=0) then
7 begin h[u,v]:=i ;
8 if i <nn then
9 begin Prbuj(i+1, u,v, q);
10 if NOT q then h[u,v]:=0;
11 end else q:=true;
12 end
13 until q OR nie ma nastpnego kandydata;
14 end
NJ (KIS) Algorytmy 11 / 222
Algorytmy z powrotami Skoczek
1 program skoczek;
2 ...
3 begin
4 a[1]:= 2; b[1]:= 1;
5 ...
6 for i :=1 to n do
7 for j :=1 to n do
8 h[ i , j ]:=0;
9 h[1,1]:=1;
10 Prbuj (2,1,1, q);
11 if q then
12 drukuj macierz h
13 else writeln(brak rozwizania);
14 end.
NJ (KIS) Algorytmy 12 / 222
Algorytmy z powrotami Skoczek
Wynik dla szachownicy 5x5
1 6 15 10 21
14 9 20 5 16
19 2 7 22 11
8 13 24 17 4
25 18 3 12 23
NJ (KIS) Algorytmy 13 / 222
Algorytmy z powrotami Skoczek
1 procedure PrbujOGLNYSZKIC;
2 begin
3 zapocztkuj wybieranie kandydatw;
4 repeat
5 wybierz nastpnego kandydata;
6 if dopuszczalny then
7 begin zapisz go;
8 if rozwizanie niepene then
9 begin PrbujOGLNYSZKIC;
10 if prba nieudana then usu zapis
11 end
12 end
13 until prba udana OR nie ma nastpnego kandydata;
14 end
NJ (KIS) Algorytmy 14 / 222
Algorytmy z powrotami Problem omiu hetmanw
Problem omiu hetmanw
Na szachownicy umieci 8 hetmanw, ale tak aby aden nie
szachowa adnego innego.
Rozwizanie: analitycznie NIE, rekurencja+powroty TAK
Podzia problemu znw na prby i powroty
1 2 3 4 5 6 7 8
1 H
2 H
3 H
4 H
5 H
6 H
7 H
8 H
NJ (KIS) Algorytmy 15 / 222
Algorytmy z powrotami Problem omiu hetmanw
1 procedure Prbuj8H(i:integer)
2 begin
3 zapocztkuj wybieranie pozycji i tego hetmana;
4 repeat
5 dokonaj nastpnego wyboru pozycji ;
6 if bezpieczna then
7 begin ustaw hetmana;
8 if i <8 then
9 begin Prbuj8H(i+1);
10 if prba nieudana then usu hetmana;
11 end
12 end
13 until prba udana OR nie ma wicej pozycji;
14 end
NJ (KIS) Algorytmy 16 / 222
Algorytmy z powrotami Problem omiu hetmanw
Szach gdy:
w tej samej kolumnie
w tym samym wierszu
na tej samej przektnej(!)
Reprezentacja:
1 x: array [1..8] of integer; { pozycja w itej kolumnie }
2 a: array [1..8] of boolean;
3 { a[ j ] brak hetmana w jtym wierszu }
4 b:array[b1.. b2] of boolean;
5 { b[k] brak hetmana na ktej przektnej }
6 c: array[c1 .. c2] of boolean;
7 { c[k] brak hetmana na ktej przektnej }
NJ (KIS) Algorytmy 17 / 222
Algorytmy z powrotami Problem omiu hetmanw
Ustaw hetmana w pozycji: i-ta kolumna, j-ty wiersz:
x[ i ]:=j ; a[ j ]:=false ; b[ i +j]:=false; c[ i j]:=false;
Usu hetmana z pozycji i,j:
a[ j ]:=true; b[ i +j]:=true; c[ i j]:=true;
Warunek bezpieczna pozycja i,j:
a[ j ] AND b[i+j] AND c[ij]
NJ (KIS) Algorytmy 18 / 222
Algorytmy z powrotami Problem omiu hetmanw
1 procedure Prbuj8H(i: integer , q:boolean)
2 var j : integer ;
3 begin j :0;
4 repeat j :=j+1; q:=false;
5 if a[ j ] AND b[i+j] AND c[ij] then
6 begin x[ i ]:=j ;
7 a[ j ]:=false ; b[ i +j]:=false ; c[ i j]:=false ;
8 if i <8 then
9 begin Prbuj8H(i+1, q);
10 if NOT q then begin
11 a[ j ]:=true; b[ i +j]:=true; c[ i j]:=true;
12 end
13 end else q:=true;
14 end
15 until q OR (j=8);
16 end
NJ (KIS) Algorytmy 19 / 222
Algorytmy z powrotami Algorytmy szukania z powrotami
Przeszukiwanie najpierw najlepszy i wizk
Nie zawsze (wrcz b. rzadko) mona pozwoli sobie na tak
dokadne przeszukanie przestrzeni rozwiza jak dla problemu
skoczka bd 8 hetmanw.
Powstay metody, ktre co prawda nie su do znajdowania
dokadanych (optymalnych) rozwiza, jak jest to konieczne w nie
ktrych problemach, ale potra za to znale podoptymalne
rozwizania, co w wielu zastosowaniach wystarcza (np. gry
strategiczne).
Takie algorytmy korzystaj z niemal identycznej struktury
algorytmu, lecz nie prowadz eksploracji wszystkich kandydatw lecz
ich podzbir, ktry jest wyznaczany odpowiednimi kryteriami
zalenymi od problemu.
Jako kryteriw okrelajcych zbir kandydatw ma kluczowe
znaczenie dla powodzenia algorytmu.
NJ (KIS) Algorytmy 20 / 222
Algorytmy z powrotami Algorytmy szukania z powrotami
1 procedure SzukajNN;
2 begin
3 zapocztkuj wybieranie kandydatw;
4 wybierz najlepszego dopuszczalnego kandydata;
5 zapisz go;
6 if rozwizanie niepene then
7 begin SzukajNN;
8 if prba nieudana then usu zapis
9 end
10 end
NJ (KIS) Algorytmy 21 / 222
Algorytmy z powrotami Algorytmy szukania z powrotami
1 procedure SzukajWizk;
2 begin
3 zapocztkuj wybieranie kandydatw;
4 wybierz podzbir (wizk) najlepszych kandydatw;
5 repeat
6 we nastpnego kandydata;
7 if dopuszczalny then
8 begin zapisz go;
9 if rozwizanie niepene then
10 begin SzukajWizk;
11 if prba nieudana then usu zapis
12 end
13 else zapisz rozwizanie ;
14 end
15 until podzbir kandydatw przeszukany;
16 end
NJ (KIS) Algorytmy 22 / 222
Algorytmy z powrotami Algorytmy szukania z powrotami
, -obcicie
Inna wersja: , -obcicie gry strategiczne, poziomy obcicia dla
funkcji oceny ruchu swojego i przeciwnika.
NJ (KIS) Algorytmy 23 / 222
Algorytmy z powrotami Algorytmy szukania z powrotami
1 procedure SzukajAB(i, rola)
2 begin
3 s = wszystkie ruchy;
4 s = s / niedopuszczalne;
5 foeach s
i
6 begin
7 nowyStan = staryStan + ruch s
i
;
8 f
i
= F(nowyStan, rola)
9 end
10 s = s / {s
i
: f
i
< AB};
11 repeat
12 zrb ruch + zapisz go;
13 if rozwizanie niepene & i < maxGboko then
14 begin
15 SzukajAB(i+1, !rola);
16 usu ruch;
17 end
18 else zapisz rozwizanie (czciowe );
19 until podzbir kandydatw przeszukany;
20 end
NJ (KIS) Algorytmy 24 / 222
Operacje na zbiorach
Operacje na zbiorach
Member(a,S) Czy a naley do S.
Insert(a,S) S = S a
Delete(a,S) S = S a
Union(A,B,C) Zastp zbiory A i B przez C.
Find(a) Podaje nazw zbioru do ktrego naley a.
Split(a,S) Rozdziela S na S
1
= b : b a b S i
S
2
= b : b > a b S.
Min(S) Podaje warto elementu minimalnego.
NJ (KIS) Algorytmy 25 / 222
Operacje na zbiorach
Gwnie interesuje nas wykonywanie cigw instrukcji typu:
Member , Insert, Delete
Zastosowania: sownikowe, wiele wiele operacji jedno- i
wielo-zbiorowych (np. algorytm Kruskala znajdowania minimalnego
drzewa rozpinajcego).
Dlatego: gwnie bdzie interesowaa nas zoono nie pojedynczej
instrukcji lecz caego cigu instrukcji .
NJ (KIS) Algorytmy 26 / 222
Operacje na zbiorach Haszowanie
Haszowanie
Rozwamy instrukcje: Insert, Delete, Member.
Niech S bdzie pewnym duym zbiorem.
NJ (KIS) Algorytmy 27 / 222
Operacje na zbiorach Haszowanie
Haszowanie: umieszcza elementy zbioru S na odpowiedniej licie w
tablicy list:
A
0
1
.
.
.
m-1
Funkcja haszujca h(a) = i wyznacza, na ktrej licie tablicy
haszujcej A ma znale si element a.
NJ (KIS) Algorytmy 28 / 222
Operacje na zbiorach Haszowanie
Wykonanie Insert(a, S) to:
wyznaczenie h(a),
przeszukanie A[h(a)],
jeli ta lista nie zawiera a, naley na koniec listy dopisa a
Wykonanie Delete(a, S) to:
wyznaczenie h(a),
przeszukanie A[h(a)],
usunicie a z listy A[h(a)] (jeli tylko jest na licie).
Wykonanie Member (a, S) analogicznie
NJ (KIS) Algorytmy 29 / 222
Operacje na zbiorach Haszowanie
Zoono obliczeniowa:
Najgorszy przypadek: Moe si zdarzy, e dla rnych n instrukcji
Insert funkcja haszujca h(a) da tak sam warto i ,
wtedy (niestety) wszystkie poszczeglne elementy a znajd
si na tej samej licie tablicy haszujcej A[h(a)]. Oznacza
to, e wykonanie n instrukcji Insert ma zoono O(n
2
).
Czas oczekiwany haszowania: Zaoenie, e wartoci h(a) s jednakowo
prawdopodobne i e wstawiamy n m wartoci, to dla
i -tego wstawiania oczekiwana dugo listy A[h(a)] wynosi
(i 1)/m (< 1!).
Co prowadzi do zoonoci O(n) dla n instrukcji Insert.
Oglnie oczekiwany koszt 1 operacji: wynosi O(1 +), gdzie =
n
m
.
NJ (KIS) Algorytmy 30 / 222
Operacje na zbiorach Haszowanie
Funkcja haszujca h(a):
Wanym zaoeniem jest, e h(a) da si obliczy w O(1).
Wybr funkcji haszujcej jest kluczowy dla pniejszej pracy
algorytmu haszowania.
Oglnie funkcja haszujca powinna kady klucz z jednakowym
prawdopodobiestwem odwzorowywa w jedn zwartoci m:
a : h(a)=j
P(a) =
1
m
dla kadego j = 0, . . . , m 1
Jest to warunek prostego rwnomiernego haszowania.
NJ (KIS) Algorytmy 31 / 222
Operacje na zbiorach Haszowanie
Gdy zaoy, e wartoci a s jednakowo prawdopodobne i
ograniczone, np. [0, N], gdzie N m, to jako funkcji haszujcej
mona uy operatora modulo:
h(a) = a mod m
Z kolei gdy klucze a bd losowymi wartociami rwnomiernie
rozoonymi na przedziale 0 a < 1, to funkcja haszujca moe
przyj posta:
h(a) = am
NJ (KIS) Algorytmy 32 / 222
Operacje na zbiorach Haszowanie
Haszowanie przez mnoenie:
h(a) = m(aB mod 1)
najpierw klucz a (cakowite wartoci) mnoymy przez pewn sta
(0 B < 1) z czego pobieramy cz uamkow, a nastpnie
mnoymy przez rozmiar tablicy A (m) i zaokrglamy do caoci.
Dobre B (
5 1)/2 = 0, 6180339887 . . .
Czasami naley skorzysta z pewnych wasnoci heurystycznych przy
doborze funkcji haszujcej szczeglnie gdy nie znamy rozkadu P.
Dla podobnych napisw f. haszujca powinna zapewni dobry
rozkad rne wartoci h(a) dla podobnych napisw, np.
tablica1, tablicaX. Tu take zastosowanie mog mie funkcje
modularne.
NJ (KIS) Algorytmy 33 / 222
Operacje na zbiorach Haszowanie
Co gdy n = m?
Gdy liczba przechowywanych elementw w danym zbiorze S osignie
warto blisk (rwn lub wiksz) dugoci tablicy A naley zwikszy
pojemno tablicy haszujcej:
Utworzy now tablic A
2
dugoci 2m.
Przez powtrne haszowanie dokonujemy kopiowania elementw
A = A
1
do A
2
Usuwamy A
1
Gdy z kolei dojdzie do przepenienia A
2
naley postpi analogicznie. . .
Odwrotnie postpujemy, gdy liczba elementw w tablicy zmniejszya si
za bardzo.
NJ (KIS) Algorytmy 34 / 222
Operacje na zbiorach Haszowanie
Haszowanie otwarte
Tablica M jest zwyk tablic elementw, ktre s przechowywane w
zbiorze.
Nie ma wic list ani innych wskanikw.
Takie zaoenia prowadz jednak do kolizji, ktre musz by
eliminowane. Robi si to przez powtrne haszowanie.
NJ (KIS) Algorytmy 35 / 222
Operacje na zbiorach Haszowanie
1 procedure HashInsert(k)
2 begin
3 size ++;
4 i =0;
5 while( i != m )
6 j = h(k,i );
7 if ( M[j] == || M[j] == )
8 M[j]=k;
9 return j ;
10 else
11 i ++;
12 end
13 error (" przepenienie tablicy / reorganizacja ");
14 end
UWAGA: Te funkcje rwnie trzeba rozbudowa o mechanizm
rozszerzania i kurczenia tablicy M. Jednak prg nie moe by blisko
penej tablicy(!).
NJ (KIS) Algorytmy 36 / 222
Operacje na zbiorach Haszowanie
1 procedure HashSearch(k)
2 begin
3 i =0;
4 while( i != m )
5 j = h(k,i );
6 if ( M[j] == )
7 return 1;
8 if ( M[j] == k )
9 return j ;
10 else
11 i ++;
12 end
13 end
NJ (KIS) Algorytmy 37 / 222
Operacje na zbiorach Haszowanie
1 procedure HashDelete(k)
2 begin
3 i =0;
4 size ;
5 while( i !=m )
6 j = h(k,i );
7 if ( M[j] == )
8 return 1;
9 if ( M[j] == k )
10 M[j] = ;
11 return j ;
12 else i ++;
13 end
14 end
NJ (KIS) Algorytmy 38 / 222
Operacje na zbiorach Haszowanie
Funkcja haszujce dla haszowania otwartego
h(k, i ) = (h
1
(k) + ih
2
(k)) mod m
h
1
(k) = k mod m
h
2
(k) = 1 + (k mod m
)
np. m
= m 1
NJ (KIS) Algorytmy 39 / 222
Operacje na zbiorach Drzewa przeszukiwa
Drzewa przeszukiwa binarnych dla operacji zbiorowych
Drzewa binarne.
n instrukcji (Insert, Delete, Member ) O(n
2
).
rednio O(n log n).
Drzewa zbalansowane (drzewa czerwonoczarne, AVL) n operacji
(Insert, Delete, Member ) daj zoono O(n log n).
NJ (KIS) Algorytmy 40 / 222
Operacje na zbiorach Drzewa przeszukiwa
Prosto i wolno . . .
Elementy zbioru: liczby cakowite od 1 do n.
Wykorzystuje: operacje Union i Find.
Niech R bdzie tablic i R[i ] = indeks zbioru.
Nazwy zbioru s nieistotne, przyjmujemy: R[i ] [1, n] (ekstremalnie
kady element naley do innego zbioru).
NJ (KIS) Algorytmy 41 / 222
Operacje na zbiorach Drzewa przeszukiwa
1 = 1, 3, 4, 6, 2 = 5, 3 = 2, 7
R
1 1
2 3
3 1
4 1
5 2
6 1
7 3
1 procedure Union(R,A,B,C)
2 var i : integer;
3 begin
4 for i :=1 to n do
5 if (R[ i ]=A) or (R[ i ]=B) then
6 R[ i ]:=C
7 end
Koszt jednej operacji Union to O(n), czyli cig n operacji oznacza
zoono O(n
2
).
NJ (KIS) Algorytmy 42 / 222
Operacje na zbiorach Drzewa przeszukiwa
Listy z dowizaniami
atwo jednak mona usprawni powyszy algorytm:
Uyjemy list z dowizaniami unikniemy przegldania caej tablicy.
Bdziemy docza mniejszy zbir do wikszego unikniemy
przegldania duszego ze zbiorw.
Teraz oprcz tablicy R bdziemy mieli take inne tablice.
LIST[A] lista z dowizaniami. LIST[A] wskazuje indeks
pierwszego elementu zbioru A w R.
NEXT[i] daje indeks kolejnego elementu tego samego zbioru co
element R[i ]. Niech j = LIST[A], wtedy NEXT[j ] to drugi
element zbioru A, NEXT[NEXT[j ]] to trzeci, etc.
SIZE[A] daje biec liczb elementw zbioru A.
EXTERNAL_NAME[A] to zewntrzna nazwa zbioru A (R[i] daje
wewntrzn nazw).
NJ (KIS) Algorytmy 43 / 222
Operacje na zbiorach Drzewa przeszukiwa
Przykad
Mamy zbiory: 1 = 1, 3, 5, 7, 2 = 2, 4, 8, 3 = 6
R NEXT
1 2 3
2 3 4
3 2 5
4 3 8
5 2 7
6 1 0
7 2 0
8 3 0
LIST SIZE EXT_NAME
1 6 1 3
2 1 4 1
3 2 3 2
INT_NAME
1 2
2 3
3 1
NJ (KIS) Algorytmy 44 / 222
Operacje na zbiorach Drzewa przeszukiwa
1 procedure Union2(I,J,K)
2 begin A:=INT_NAME[I]; B:=INT_NAME[J];
3 { dopisujemy krtsz do duszej }
4 if SIZE[A]>SIZE[B] then zamieniamy rolami A i B;
5 e := LIST[A];
6 while e<>0 do { przepisywanie elementw z A do B }
7 begin
8 R[e]:=B;
9 last :=e;
10 e:=NEXT[e];
11 end
12 NEXT[last]:=LIST[B];
13 LIST[B]:=LIST[A];
14 SIZE[B]:=SIZE[A]+SIZE[B];
15 INT_NAME[K]:=B; EXT_NAME[B]:=K;
16 end
NJ (KIS) Algorytmy 45 / 222
Operacje na zbiorach Drzewa przeszukiwa
Zoono Union2
Zoono wykonania n 1 instrukcji Union2 to O(n log n).
Taka zoono wynika z faktu, e kady element moe by przeoony
tylko do zbioru niemniej ni 2 razy wikszego.
Co oznacza, e kady element moe by przenoszony co najwyej log n
razy, daje to koszt O(log n) (dla pojedynczego elementu).
Zoono pojedynczego Find(i ) pozostaje O(1).
NJ (KIS) Algorytmy 46 / 222
Operacje na zbiorach Union-Find
Struktury drzew dla problemu Union-Find
Rodzina zbiorw bdzie reprezentowana przez las drzew. Jedno
drzewo = jeden zbir.
Zbir A ma (tylko) korze T
A
.
Nazw zbioru ma korze drzewa.
NJ (KIS) Algorytmy 47 / 222
Operacje na zbiorach Union-Find
Union(A,B,C) mona zrealizowa poprzez:
uczynienie korzenia T
A
synem T
B
,
zmian nazwy korzenia T
B
na C.
T
A
A
+
T
B
B
=
T
CB
T
A
A
B
Koszt czenia: O(1)
NJ (KIS) Algorytmy 48 / 222
Operacje na zbiorach Union-Find
Find(i) mona zrealizowa poprzez:
odszukanie wierzchoka, ktry odpowiada i w pewnym drzewie T,
mona uy tablicy wskanikw na wzy drzewa: t[i] wsk. na i-ty
element
przejcie z wierzchoka do korzenia, w ktrym zapisana jest nazwa
drzewa do ktrego naley i .
Koszt Find: O(h), gdzie h, to wysoko drzewa
NJ (KIS) Algorytmy 49 / 222
Operacje na zbiorach Union-Find
Koszt Find: jest rzdu dugoci cieki z wierzchoka i do korzenia
drzewa.
Rozpatrzmy cig instrukcji:
Union(1,2,2)
Union(2,3,3)
.
.
.
Union(n-1,n,n)
Find(1)
Find(2)
.
.
.
Find(n)
NJ (KIS) Algorytmy 50 / 222
Operacje na zbiorach Union-Find
n
n-1
n-2
2
1
Cig instrukcji Union powoduje powstanie
drzewa listy:
Wtedy koszt wykonania n instrukcji Find wy-
nosi:
n1
i =0
i =
n(n1)
2
.
Taki koszt wymusza, aby czc minimalizo-
wa wysoko wynikowego drzewa poprzez
przyczanie mniejszego drzewa pod wiksze.
T
A
A
+
T
B
B
=
T
CA
A
T
B
B
NJ (KIS) Algorytmy 51 / 222
Operacje na zbiorach Union-Find
Kompresja cieki
Kolejna modykacja polega na kompresji cieki podczas
wykonywania funkcji Find koszt tej funkcji jest duo wikszy ni
Union.
Koszt Find(i) jest zwizany z dugoci cieki od wierzchoka i do
korzenia r drzewa.
i , v
1
, v
2
, . . . , v
n1
, r cieka od i do r .
Kompresja cieki to uczynienie kadego wierzchoka v
j
synem
korzenia r :
NJ (KIS) Algorytmy 52 / 222
Operacje na zbiorach Union-Find
r
T
r
k
T
k
j
T
j
i
T
i
r
T
r
k
T
k
j
T
j
i
T
i
NJ (KIS) Algorytmy 53 / 222
Operacje na zbiorach Union-Find
Implementacja moe by oparta o tablice.
Inicjowanie:
COUNT[i ] = 1 1 i n liczno zbioru, ktremu odpowiada
i-ty wze
NAME[i ] = i 1 i n nazwa i-tego zbioru
FATHER[i ] = 0 1 i n czyli kade drzewo to pojedynczy
wze.
ROOT[i ] = i 1 i n id wza-korzenia i-tego zbioru
na pocztku wze = korze
NJ (KIS) Algorytmy 54 / 222
Operacje na zbiorach Union-Find
1 procedure Find(i);
2 begin
3 oprnij list LIST;
4 v:=i ;
5 while FATHER[v] ,= do
6 begin
7 dodaj v do LIST;
8 v:=FATHER[v];
9 end
10 { v jest teraz korzeniem }
11 foreach w LIST do
12 FATHER[w]:=v;
13 return NAME[v];
14 end
NJ (KIS) Algorytmy 55 / 222
Operacje na zbiorach Union-Find
1 procedure Union(i,j , k);
2 begin
3 if COUNT[ROOT[i]] > COUNT[ROOT[j]] then
4 zamieniamy rolami i z j ;
5 LARGE:=ROOT[j];
6 SMALL:=ROOT[i];
7 FATHER[SMALL]:=LARGE;
8 COUNT[LARGE]:=COUNT[LARGE]+COUNT[SMALL];
9 NAME[LARGE]:=k;
10 ROOT[k]:=LARGE;
11 end
NJ (KIS) Algorytmy 56 / 222
Operacje na zbiorach Union-Find
Zoono
n instrukcji Union-Find teraz ma zoono: O(n log
n).
log
o maksymalnym f [.].
Jak poprzednio (nieodwiedzone) wierzchoki z ktrych r
jest
osigalny skadaj si na sss. Czyli wierzchoki nieodwiedzone
osigalne z r
w G
T
skadaj si na kolejn sss.
NJ (KIS) Algorytmy 71 / 222
Problem silnie spjnych skadowych
SSS, Punkty artykulacji i mosty
SSS vs drogi miasta wyznaczanie krytycznych odcinkw drg.
Punkt artykulacji = wierzchoek (skrzyowanie), ktrego usunicie
rozspjnia graf.
Most = krawd, ktrej usunicie rozspjnia graf.
NJ (KIS) Algorytmy 72 / 222
Problem silnie spjnych skadowych
Zadania
Analiza algorytmu.
Jak wyznaczy graf skadowych? Podaj algorytm.
Jak wyznaczy punkty artykulacji i mosty? Podaj algorytm.
NJ (KIS) Algorytmy 73 / 222
Problem spenialnoci regu logicznych
Problem spenialnoci regu logicznych SAT
Problem SAT: Czy zadana regua logiczna L oparta o zmienne
logiczne x
1
, . . . , x
n
jest spenialna?
Czyli czy istnieje pewne przypisanie wartoci prawda lub fasz
zmiennym x
i
, dla ktrego regua L bya speniona?
W oglnoci wyraenie L moe skada si z rnych operatorw
logicznych: , , , =, XOR, , , . . .
Dla wikszo typw regu logicznych nie ma efektywnych
(wielomianowych) algorytmw. Co pozostawia testowanie 2
n
moliwych ukadw prawda/falsz.
NJ (KIS) Algorytmy 74 / 222
Problem spenialnoci regu logicznych
Rne formy reprezentacji regu logicznych. Np. CNF i DNF
CNF (conjunction normal form)
L = (p
11
. . . p
1k
1
) (p
21
. . . p
2k
2
) . . . (p
n1
. . . p
nk
n
)
gdzie p
ij
to pewna zmienna x
q
lub x
q
.
DNF (disjunction normal form)
L = (p
11
. . . p
1k
1
) (p
21
. . . p
2k
2
) . . . (p
n1
. . . p
nk
n
)
NJ (KIS) Algorytmy 75 / 222
Problem spenialnoci regu logicznych
k-CNF i 2-CNF
k-CNF (conjunction normal form)
L = (p
11
. . . p
1k
) (p
21
. . . p
2k
) . . . (p
n1
. . . p
nk
)
2-CNF (conjunction normal form)
L = (p
11
p
12
) (p
21
p
22
) . . . (p
n1
p
n2
)
Dla dowolnej postaci rgu logicznych problem jest NP-zupeny
Dla 3-CNF problem jest NP-zupeny
Dla 2-CNF problem ma efektywny algorytm!
NJ (KIS) Algorytmy 76 / 222
Problem spenialnoci regu logicznych
Algorytm spenialnoci regu typu 2-CNF
Przejcie z 2-CNF do postaci koniunkcji implikacji
Analiza silnie spjnych skadowych
Ustalenie konsekwencji wynikajcych z SSS
Moliwo wyznaczenie wartoci zmiennych x
i
realizujcych
spenialno formuy, jeli tylko to moliwe.
NJ (KIS) Algorytmy 77 / 222
Problem spenialnoci regu logicznych
Przejcie z 2-CNF do postaci koniunkcji implikacji
(x
0
x
3
) (x
0
= x
3
) (x
3
= x
0
)
p q p = q q = p p q
0 0 1 1 1
0 1 1 1 1
1 0 0 0 0
1 1 1 1 1
NJ (KIS) Algorytmy 78 / 222
Problem spenialnoci regu logicznych
(x
0
x
2
) (x
0
x
3
) (x
1
x
3
) (x
1
x
4
)
(x
2
x
4
) (x
0
x
5
) (x
1
x
5
) (x
2
x
5
)
(x
3
x
6
) (x
4
x
6
) (x
5
x
6
)
NJ (KIS) Algorytmy 79 / 222
Problem spenialnoci regu logicznych
1 function Test_2CNF(CNF_rule)
2 CNF_rule > Graf implikacji G
3 SSS = Silnie_spojne_skladowe(G)
4 foreach v in V do
5 if SSS[v] == SSS[v] then
6 return false ;
7 return true;
8 end
Zmienne nalece do jednej SSS skadowej musz mie tak sam
warto! Czyli nie mog do SSS nalee: x
k
i x
k
.
NJ (KIS) Algorytmy 80 / 222
Problem spenialnoci regu logicznych
1 function Test_2CNF(CNF_rule)
2 CNF_rule Graf implikacji G
3 SSS = Silnie_spjne_skadowe(G)
4 foreach v in V do
5 if SSS[v] == SSS[v] then
6 return false ;
7 Tworzenie grafu silnie spjnych skadowych
8 L = list of SSS; porzdek zgodny z drugim DFS
9 foreach c in L do
10 if all v in c bez przypisanych wartoci
11 ustawi wszystkie v na false
12 ustawi w komplementarnych skadowych wartoci
13 v
na true
14 (tych do ktrych prowadz krawdzie)
15 return wektor wartoci zmiennych x;
16 end
Tak wyznaczone wartoci zmiennych logicznych speniaj regu.
NJ (KIS) Algorytmy 81 / 222
Cykl Eulera
Cykl Eulera
Cyklem Eulera nazywamy taki cykl w grae G(V, E) (skierowany bd
nie), ktry przechodzi przez wszystkie krawdzie dokadnie raz i przez
kady wierzchoek przynajmniej raz.
NJ (KIS) Algorytmy 82 / 222
Cykl Eulera
Dla grafu spjnego skierowanego:
Cykl Eulera istnieje wtedy i tylko wtedy gdy dla kadego wierzchoka
liczba krawdzi wchodzcych i wychodzcych jest rwna.
Dla grafu spjnego nieskierowanego:
Cykl Eulera istnieje wtedy i tylko wtedy gdy stopie kadego wierzchoka
jest parzysty.
NJ (KIS) Algorytmy 83 / 222
Cykl Eulera
1 procedure CyklEulera(G, u)
2 push(STOS,u);
3 while STOS <> do
4 v:=top(STOS);
5 if S[v]= then
6 begin
7 pop(STOS);
8 LISTA v; {wstaw v na pocztek}
9 end else
10 begin
11 w:=pop(S[v]);
12 push(STOS,w);
13 end
14 return LISTA;
15 end
NJ (KIS) Algorytmy 84 / 222
Cykl Eulera
12562341
3 6
4 2
1 5
3 8
4 2
1 7
5 6
12782341561
NJ (KIS) Algorytmy 85 / 222
Problem maksymalnego przepywu
Problem maksymalnego przepywu
Sieci przepywowe
rdo (s) i ujcie (t)
Transport (przepyw) towaru od rda wytwarzania do ujcia
(miejsca zuycia).
v
1
v
3
s
t
v
2
v
4
16
12
20
13
10 4
14
9
4
7
NJ (KIS) Algorytmy 86 / 222
Problem maksymalnego przepywu
Zastosowania:
Modelowanie przepywu cieczy w sieci kanaw, przepustowoci drug
publicznych.
Przepyw informacji w sieciach komunikacyjnych (Internet, telefonia
cyfrowa).
Modelowanie przepywu prdu w sieciach energetycznych.
NJ (KIS) Algorytmy 87 / 222
Problem maksymalnego przepywu
Wierzchoki miejscowoci (czy komputery, routery, switche, . . . )
Krawdzie kanay przepywu (informacji, cieczy, towaru, . . . )
Waga krawdzi deniuje maksymaln przepustowo krawdzi
(cza).
Wierzchoki na ciekach pomidzy rdem i ujciem s
wykorzystywane do realizacji przepywu.
Szybko wpywania do wierzchoka musi by taka sama jak
wypywania (wasno zachowania przepywu)!
Towar/Informacja nie jest przetrzymywany(-a) w wierzchokach.
Maksymalny przepyw = maksymalna prdko z jak mona
transportowa towar ze rda do ujcia.
NJ (KIS) Algorytmy 88 / 222
Problem maksymalnego przepywu
Sie przepywowa to graf G(V, E), gdzie dla kadej krawdzi (u, v)
mamy okrelone c(u, v) 0, co odpowiada przepustowoci krawdzi.
Jeli (u, v) , E to c(u, v) = 0.
Sie przepywowa ma wyrnione dwa wierzchoki: rdo s i ujcie t.
NJ (KIS) Algorytmy 89 / 222
Problem maksymalnego przepywu
Przepyw sieci
Przepyw sieci G to funkcja f : V V , ktra spenia trzy warunki:
Warunek przepustowoci: dla wszystkich u i v mamy
f (u, v) c(u, v).
Oznacza to, e przepyw nie moe przekracza przepustowoci.
Warunek skonej symetrycznoci: dla wszystkich u i v mamy
f (u, v) = f (v, u).
Mamy wic: f (u, u) = f (u, u), czyli f (u, u) = 0.
NJ (KIS) Algorytmy 90 / 222
Problem maksymalnego przepywu
Warunek zachowania przepywu: dla kadego u V s, t mamy
vV
f (u, v) = 0.
Warunek wymusza aby cay towar wpywajcy do u wypywa z u
NJ (KIS) Algorytmy 91 / 222
Problem maksymalnego przepywu
Z warunku skonej symetrycznoci i zachowania przepywu mamy:
Dla kadego v V s, t
uV
f (u, v) = 0.
f (u, v) nazywa si przepywem netto z wierzchoka u do v (moe by
dodatni bd ujemny).
Warto przepywu [f [ deniuje si jako
[f [ =
vV
f (s, v)
czny przepyw netto wypywajcy ze rda s. Jak potem zobaczymy
bdzie rwny cakowitemu wpywowi do t.
NJ (KIS) Algorytmy 92 / 222
Problem maksymalnego przepywu
v
1
v
3
s
t
v
2
v
4
16
12
20
13
10 4
14
9
4
7
przepyw / przepustowo
v
1
v
3
s
t
v
2
v
4
11/16
12/12
15/20
8/13
10
1/4
11/14
4/9
4/4
7/7
UWAGA: Prezentujemy TYLKO dodatni przepyw netto (f (u, v) > 0).
NJ (KIS) Algorytmy 93 / 222
Problem maksymalnego przepywu
a
v
1
v
2
10 4
b
v
1
v
2
8/10
4
c
v
1
v
2
8/10 3/4
d
v
1
v
2
5/10
4
e
v
1
v
2
10
2/4
a przepustowoci G
b 8 z v
1
do v
2
c 8 z v
1
do v
2
i 3 z v
2
do v
1
d po REDUKCJI: 5 z v
1
do v
2
Czyli nie ma sensu woenie tego samego towaru z v
1
do v
2
i z v
2
do v
1
.
e dodatkowo 7 z v
2
do v
1
NJ (KIS) Algorytmy 94 / 222
Problem maksymalnego przepywu
Sieci z wieloma rdami i wieloma ujciami
Problem maksymalnego przepywu mona take zdeniowa dla wicej
ni jednego rda i wikszej liczby uj.
Na szczcie problem maksymalnego przepywu w takim przypadku jest
tak samo trudny. Co wicej problemy s rwnowane.
Mona wprowadzi super-rda s ktre bdzie poczone z kadym
rdem s
i
(i = 1, . . . , n) krawdzi o przepustowoci . Wprowadzamy
analogicznie super-ujcie t, do ktrego wpadaj krawdzie z kadego
ujcia t
j
(j = 1, . . . , m) take o nieskoczonej przepustowoci.
NJ (KIS) Algorytmy 95 / 222
Problem maksymalnego przepywu
s
1
s
2
t
1
s
s
3
t
2
t
s
4
t
3
s
5
10
5
14
11
12
8
7
2
3
6
13
15
20
18
NJ (KIS) Algorytmy 96 / 222
Problem maksymalnego przepywu
Zmiana notacji:
V s V s
Niech
f (X, Y) =
xX
yY
f (x, y)
Wtedy prawo zachowania przepywu to: f (u, V) = 0 dla u V s t.
NJ (KIS) Algorytmy 97 / 222
Problem maksymalnego przepywu
Lemat
Zachodz nastpujce wasnoci:
f (X, X) = 0 X V
f (X, Y) = f (Y, X) X, Y V
Niech X, Y, Z V i X Y = , wtedy:
f (X Y, Z) = f (X, Z) + f (Y, Z)
f (Z, X Y) = f (Z, X) + f (Z, Y)
NJ (KIS) Algorytmy 98 / 222
Problem maksymalnego przepywu
Moemy pokaza, e
[f [ = f (V, t)
Czyli, e czny przepyw jest rwny cakowitemu wpywowi do ujcia.
[f [ = f (s, V)
= f (V, V) f (V s, V)
= f (V, V s)
= f (V, t) + f (V, V s t)
= f (V, t)
NJ (KIS) Algorytmy 99 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
Metoda Forda-Fulkersona
Start:
u,v
f (u, v) = 0
cieka powikszajca cieka ze rda s w G do ujcia t po ktrej
moemy przesa wikszy przepyw.
Iteracyjnie, przepyw jest powikszany o moliwoci jakie daje kada
cieka powikszajca.
Koniec gdy nie istnieje adna cieka powikszajca z s do t.
NJ (KIS) Algorytmy 100 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
1 procedure FordFulkerson
2 begin
3 inicjowanie f na 0
4 while istnieje cieka powikszajca p do
5 powiksz przepyw f wzdu p
6 return f
7 end
NJ (KIS) Algorytmy 101 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
Jak wyznacza cieki powikszajce? Sieci residualne
Sie residualna dla grafu G skada si z krawdzi, ktre dopuszczaj
wikszy przepyw netto.
Przepustowoci residualn dla (u, v) nazywamy dodatkowy przepyw
w G zdeniowany poprzez:
c
f
(u, v) = c(u, v) f (u, v).
np. c(u, v) = 10, f (u, v) = 6, to c
f
(u, v) = 4
G
u
v2
6/10
G
f u
v2
4
Czyli przepustowo residualna to niewykorzystana przepustowo
krawdzi w sieci grafu G.
NJ (KIS) Algorytmy 102 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
Gdy przepyw netto jest ujemny przepustowo residualna moe by
wiksza ni c(u, v).
np. c(u, v) = 10, f (u, v) = 6, to c
f
(u, v) = 16
G
u
v2
6/10
G
f u
v2
16
NJ (KIS) Algorytmy 103 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
Sieci residualn dla G = (V, E) indukowan przez f nazywamy sie
G
f
= (V, E
f
) tak, e
E
f
= (u, v) V V : c
f
(u, v) > 0.
Czyli sie skada si z tych samych wierzchokw co G, ale krawdzie
tworz przepustowoci residualne czyli krawdzie umoliwiajce uzyskanie
dodatniego przepywu netto.
NJ (KIS) Algorytmy 104 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
G, f
v
1
v
3
s
t
v
2
v
4
11/16
12/12
15/20
8/13
10
1/4
11/14
4/9
4/4
7/7
G
f
v
1
v
3
s
t
v
2
v
4
5
11
12
5
15
5
8
11 3
3
11
5
4
4
7
G, f
v
1
v
3
s
t
v
2
v
4
11/16
12/12
19/20
12/13
10
1/4
11/14
9
4/4
7/7
NJ (KIS) Algorytmy 105 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
G, f
v
1
v
3
s
t
v
2
v
4
11/16
12/12
19/20
12/13
10
1/4
11/14
9
4/4
7/7
G
f
v
1
v
3
s
t
v
2
v
4
5
11
12
1
19
1
12
11 3
3
11
9
4
7
NJ (KIS) Algorytmy 106 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
Liczba krawdzi residualnych [E
f
[ jest ograniczona z gry przez 2[E[.
Lemat
Mamy sie G, rdo s, ujcie t, przepyw f dla G, sie residualn G
f
dla
sieci G indukowan przez f . Niech f
oznacza przepyw w sieci G
f
wtedy
suma przepyww f + f
jest przepywem w sieci G o wartoci
[f + f
[ = [f [ +[f
[
Dowd:
NJ (KIS) Algorytmy 107 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
1. skona symetryczno:
(f + f
)(u, v) = f (u, v) + f
(u, v)
= f (v, u) f
(v, u)
= (f (v, u) + f
(v, u))
= (f + f
)(v, u)
NJ (KIS) Algorytmy 108 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
2. przepustowo
wiemy: f
(u, v) c
f
(u, v)
(f + f
)(u, v) = f (u, v) + f
(u, v)
f (u, v) + (c(u, v) f (u, v))
= c(u, v)
NJ (KIS) Algorytmy 109 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
3. zachowanie przepywu
u V s t
vV
(f + f
)(u, v) =
vV
(f (u, v) + f
(u, v))
=
vV
f (u, v) +
vV
f
(u, v)
= 0 + 0
NJ (KIS) Algorytmy 110 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
Warto przepywu [f + f
[ wynosi:
[f + f
[ =
vV
(f + f
)(s, v)
=
vV
(f (s, v) + f
(s, v))
=
vV
f (s, v) +
vV
f
(s, v)
= [f [ +[f
[
NJ (KIS) Algorytmy 111 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
cieki powikszajce formalnie
Dla sieci G i przepywu f ciek powikszajc p jest kada cieka z
rda s do ujcia t w sieci residualnej G
f
.
G, f
v
1
v
3
s
t
v
2
v
4
11/16
12/12
15/20
8/13
10
1/4
11/14
4/9
4/4
7/7
G
f
v
1
v
3
s t
v
2
v
4
5
11
12
5
15
5
8
11 3
3
11
5
4
4
7
NJ (KIS) Algorytmy 112 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
Przepustowo residualna cieki p:
c
f
(p) = minc
f
(u, v) : (u, v) ley na ciece p
NJ (KIS) Algorytmy 113 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
Lemat
Mamy sie G, przepyw f sieci G, ciek powikszajc p w sieci G
f
.
Zdeniujmy funkcj f
p
: V V :
f
p
(u, v) =
c
f
(p) jeli (u, v) jest na p
c
f
(p) jeli (v, u) jest na p
0 wp.p.
Wtedy f
p
jest przepywem w sieci G
f
o wartoci [f
p
[ = c
f
(p) > 0.
Z powyszego lematu wynika, e dodajc przepyw f
p
do f
otrzymujemy wikszy przepyw w G.
NJ (KIS) Algorytmy 114 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
Przekroje w sieciach
Mamy sie G = (V, E). Przekrojem (S, T) nazywamy taki podzia V na
S i T, e s S i t T, i T = V S.
Wtedy przepyw netto przez przekrj to f (S, T).
A przepustowo przekroju: c(S, T).
S i T
v
1
v
3
s
t
v
2
v
4
11/16
12/12
15/20
8/13
10
1/4
11/14
4/9
4/4
7/7
NJ (KIS) Algorytmy 115 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
Niech f bdzie przepywem netto w G, a (S, T) przekrojem. Wtedy
przepyw przekroju rwny jest przepywowi sieci f(S,T)=|f|.
Dowd:
f (S, T) = f (S, V) f (S, S)
= f (S, V)
= f (s, V) + f (S s, V)
= f (s, V)
= [f [
NJ (KIS) Algorytmy 116 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
Skd wnioskujemy:
Warto dowolnego przepywu f w G jest nie wiksza ni przepustowo
dowolnego przekroju w G.
Dowd:
[f [ = f (S, T)
=
uS
vT
f (u, v)
uS
vT
c(u, v)
= c(S, T)
NJ (KIS) Algorytmy 117 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
Twierdzenie o maksymalnym przepywie i minimalnym
przekroju
Dla sieci G o rdle s i ujciu t nastpujce trzy warunki s rwnowane:
1
Przepyw f jest maksymalny.
2
Sie residualna G
f
nie zawiera cieek powikszajcych.
3
Dla pewnego przekroju (S, T) w G zachodzi: [f [ = c(S, T).
1 2
zamy przeciwnie: f przepyw maksymalny, a G
f
ma ciek
powikszajc. Wtedy jednak wiemy, e f + f
p
bdzie przepywem
wikszym ni f .
NJ (KIS) Algorytmy 118 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
2 3
Niech S bdzie zbiorem wierzchokw osigalnych z s:
S = v V : s v w G
f
.
T = V S.
Poniewa nie istnieje cieka powikszajca z s do t w G
f
, to mamy
f (u, v) = c(u, v), gdy tylko u S i v T. W przeciwnym przypadku v
byby w S. Mamy wic: f (S, T) = c(S, T) = [f [.
3 1
dla kadego przekroju zachodzi: f c(S, T). Czyli [f [ = c(S, T)
oznacza, e jest to maksymalny pord moliwych przepyww.
NJ (KIS) Algorytmy 119 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
1 procedure FordFulkerson(G,s,t)
2 begin
3 foreach (u, v) E do
4 begin f (u,v)=0; f(v,u)=0; end
5
6 while istnieje cieka p z s do t w G
f
(graf
7 residualny ) do
8 begin
9 c
f
(p) = minc
f
(u, v) : (u, v) jest na p
10 for kada krawd (u, v) na p do
11 begin f(u,v) = f(u,v) + c
f
(p);
12 f (v,u) = f(u,v)
13 end
14 end
15 end
NJ (KIS) Algorytmy 120 / 222
Problem maksymalnego przepywu Metoda Forda-Fulkersona
Gdy zaoy, e przepustowo bdzie wyraana w liczbach cakowitych
to zoono algorytmu wynosi O(E[f
[), gdzie f
jest maksymalnym
przepywem.
Wynika to z faktu, i znalezienie cieki powikszajcej w G
f
jest
proporcjonalne do E (np. poprzez przeszukiwanie w gb), a kade
powikszenie cieki moe w najgorszym razie poprawi przepyw netto o
1.
Warto uywa, gdy [f
[ jest nie za due.
Zastpujc przeszukiwanie w gb na przeszukiwanie wszerz aby
znale ciek powikszajc w grae residualnym zoono redukuje
si do O(VE
2
)
NJ (KIS) Algorytmy 121 / 222
Problem maksymalnego przepywu Metody przedprzepywowe
Metody przedprzepywowe
Aby wyobrazi sobie jak dziaa ta metoda lepiej myle o przepywie
wody, ktra moe pyn tylko w d.
Na potrzeby algorytmu kady wierzchoek bdzie mia zbiornik o
nieograniczonej pojemnoci. Kady wierzchoek wraz z przyczami
rur umieszczamy na specjalnej platformie, ktrej pozycja bdzie
podnoszona wraz z dziaaniem algorytmu.
Wysoko wierzchoka bdzie w istotny sposb wpywa na
przepyw!!!
Metoda przedprzepywowa nie bdzie utrzymywaa wasnoci
zachowania przepywu. Natomiast bdzie speniony warunek
sabszy: f (V, u) 0, ktry okrela sumaryczny wpyw do pewnego
wierzchoka u (u V s).
NJ (KIS) Algorytmy 122 / 222
Problem maksymalnego przepywu Metody przedprzepywowe
u bdzie wierzchokiem nadmiarowym, gdy f (V, u) > 0 (nadmiar:
e[u] = f (V, u)).
Przepyw jest realizowany tylko do wierzchoka pooonego niej, ale
funkcja przepywu moe mie wartoci dodatnie skierowane do
wierzchoka pooonego powyej.
Wysoko rda wynosi [V[, a ujcia 0 to nie podlega zmianie.
Wysokoci pozostaych wierzchokw s ustawione na pocztkow
warto 0 i bd rosy.
Startujemy z realizacj caego przepywu, wypywajcego ze rda
wypeniajc maksymalnie istniejce odprowadzajce rury.
Woda najpierw traa do zbiornika a nastpnie jest kierowana do
pooonych niej wierzchokw.
Jednak problem polega na tym, e aby woda pyna dalej
wierzchoek musi by powyej niewypenionych jeszcze innych
wierzchokw poczonych rurami. Tak moe nie by.
NJ (KIS) Algorytmy 123 / 222
Problem maksymalnego przepywu Metody przedprzepywowe
W takich przypadkach bdziemy podnosi wysoko wierzchoka,
aby nadmiar wody mg spyn niej.
Wysoko takiego wierzchoka podnosimy o 1 wicej ni wysoko
najniszego wierzchoka do ktrego prowadzi niewypeniona w
caoci rura.
Dziki temu pewien nadmiar wody bdzie mg spyn w d.
Po powtrzeniach tej operacji w kocu caa woda spynie do ujcia.
Jednak nie wicej ni to moliwe dziki ograniczeniu
przepustowoci krawdzi.
NJ (KIS) Algorytmy 124 / 222
Problem maksymalnego przepywu Metody przedprzepywowe
Jednake tak uzyskany przepyw moe by nielegalny poniewa
moe pozosta woda w zbiornikach wierzchokw, ktra nie ma jak
spyn.
Taki nadmiar cofany jest do rda poprzez podnoszenie wysokoci
wierzchokw powyej wysokoci rda [V[. A w algorytmie bdzie
to realizowane przez kasowanie przepyww nadmiarowych.
Po oprnieniu zbiornikw uzyskujemy legalny i maksymalny
przepyw.
NJ (KIS) Algorytmy 125 / 222
Problem maksymalnego przepywu Metody przedprzepywowe
Operacje PUSH i LIFT
Algorytm skada si z szeregu wykona operacji przesyania
nadmiaru wody (PUSH) i podnoszenia wysokoci wierzchokw
(LIFT).
Funkcja h : V N jest wysokoci w sieci G = (V, E) ze rdem
s i ujciem t, gdy:
h(s) = [V[,
h(t) = 0,
h(u) h(v) + 1, gdy (u, v) jest krawdzi residualn (u, v) E
f
.
Czyli gdy h(u) > h(v) + 1, to (u, v) nie jest krawdzi w grae
residualnym.
NJ (KIS) Algorytmy 126 / 222
Problem maksymalnego przepywu Metody przedprzepywowe
Operacj PUSH(u, v) mona stosowa u jest wierzchokiem
nadmiarowym (e[u] > 0) i h(u) = h(v) + 1 (tj. jest co do przelania
i u jest bezporednio nad v).
e[u] bdzie nadmiarem wody przechowywanym w wierzchoku u.
d
f
(u, v) przechowuje informacj o wielkoci przepywu jaki mona
przesa z u do v.
1 procedure PUSH(u,v)
2 d
f
(u, v) = min(e[u], c
f
(u, v))
3 f [u, v] = f [u, v] + d
f
(u, v)
4 f [v, u] = f [u, v]
5 e[u] = e[u] d
f
(u, v)
6 e[v] = e[v] + d
f
(u, v)
7 end
NJ (KIS) Algorytmy 127 / 222
Problem maksymalnego przepywu Metody przedprzepywowe
Warto zwrci uwag, e gdy f jest przedprzepywem to po
wykonaniu PUSH(u, v) te bdzie przedprzepywem.
Operacja PUSH(u, v) przesyania jest nasycajca, gdy po jej
wykonaniu c
f
(u, v) = 0.
Operacja LIFT(u) jest wykonywana gdy:
1
u jest nadmiarowy
2
v
(u, v) E
f
h[u] h[v] tj. woda nie moe si przela.
1 procedure LIFT(u)
2 h[u] = 1 + min(h[v] : (u, v) E
f
)
3 end
Operacja LIFT jest stosowana tylko, gdy woda moga by si przela
z wierzchoka u, ale nie moe.
NJ (KIS) Algorytmy 128 / 222
Problem maksymalnego przepywu Metody przedprzepywowe
1 procedure Initialize PreFlow(G,s)
2 foreach u V do
3 h[u]=0, e[u]=0;
4 foreach (u, v) E do
5 f [ u,v]=0, f [v, u]=0;
6 h[s]=[V[;
7 foreach u S[s] do
8 begin
9 f [ s , u]=c[s, u];
10 f [ u, s]=c[u,s];
11 e[ u]=c[s, u];
12 end
13 end
NJ (KIS) Algorytmy 129 / 222
Problem maksymalnego przepywu Metody przedprzepywowe
1 procedure GenericPreFlowPUSH(G)
2 Initialize PreFlow(G,s);
3 while mona stosowa operacj przesania
4 lub podniesienia do
5 wybierz jedn z operacji i wykonaj;
6 end
NJ (KIS) Algorytmy 130 / 222
Problem maksymalnego przepywu Metody przedprzepywowe
Zoono metody przedprzepywowej
Ograniczenie na liczb podnosze: < 2[V[
2
.
Ograniczenie na liczb przesa nasycajcych: < 2[V[[E[
Ograniczenie na liczb przesa nienasycajcych: < 4[V[
2
([V[ +[E[)
Ostatecznie zoono wynosi: O(V
2
E)
NJ (KIS) Algorytmy 131 / 222
Problem maksymalnego przepywu Metody przedprzepywowe
Od O(V
2
E) do O(V
3
) Podnie i przesu na pocztek
Aby osign powysz zoono nowy algorytm bdzie bazowa na
licie wierzchokw L, co bdzie regulowao cilej kolejnoci
wykonywanych operacji PUSH i LIFT.
Lista ta bdzie przegldana od pocztku w poszukiwaniu
wierzchoka nadmiarowego.
W nastpnym kroku nastpuje cakowite rozadowanie takiego
wierzchoka (poprzez wykonywanie operacji PUSH i LIFT a do
skutku).
Jeli wierzchoek podczas rozadowywania uleg podniesieniu zostaje
przeniesiony na pocztek listy L, a gwna ptla algorytmu
rozpoczyna prac od pocztku listy L (w poniszej implementacji
tak naprawd od drugiego wierzchoka).
NJ (KIS) Algorytmy 132 / 222
Problem maksymalnego przepywu Metody przedprzepywowe
1 procedure Discharge(u)
2 while e[u]>0 do
3 begin
4 v:=currentS[u];
5 if v=NIL then ( po ostatnim ssiedzie )
6 begin
7 LIFT(u);
8 currentS[ u]:=head[S[u ]];
9 end
10 else if c
f
(u, v) > 0 AND h[u]=h[v]+1 then
11 PUSH(u,v);
12 else currentS[ u]:=nextS[v ];
13 end
14 end
NJ (KIS) Algorytmy 133 / 222
Problem maksymalnego przepywu Metody przedprzepywowe
1 procedure LiftToFront(G,s,t)
2 Initialize PreFlow(G,s);
3 L:=Vst;
4 foreach v V s t do
5 currentS[u]:=head[S[u ]];
6 u:=head[L];
7 while u ,= NIL do
8 begin
9 oldHeight[u]:=h[u];
10 Discharge(u);
11 if h[u]>oldHeight then
12 przesu u na pocztek L;
13 u:=nextS[u];
14 end
15 end
NJ (KIS) Algorytmy 134 / 222
Algorytmy plecakowe
Algorytmy plecakowe
Trzy rne problemy adowania"plecaka = trzy rne algorytmy
Niewielka zmiana denicji problemu = wielka zmiana koncepcji
optymalnego rozwizania, wielka rnica w zoonoci
NJ (KIS) Algorytmy 135 / 222
Algorytmy plecakowe
Cigy problem plecakowy
Mamy plecak o pojemnoci W.
Mamy dany zbir N towarw. Kady towar ma swoj cen c
i
i
wielko w
i
.
Kadego towaru mona wzi dowoln ilo lecz nie wicej ni w
i
.
cznie nie mona wzi wicej towarw ni W.
Warto zaadowanego plecaka ma by najwiksza.
Co rozwizuje problem?
NJ (KIS) Algorytmy 136 / 222
Algorytmy plecakowe
Wyznaczmy wzgldn warto towarw:
q
i
=
c
i
w
i
Teraz wiemy co jest najbardziej wartociowym towarem, czy to
zoto, czy biaa herbata, czy diamenty???
Sortujemy cig q
i
od najwartociowszego towaru.
Bierzemy kolejno towary, zgodnie z posortowaniem, ktre mieszcz
si w plecaku a do penego wypenienia.
NJ (KIS) Algorytmy 137 / 222
Algorytmy plecakowe
1 procedure PlecakCiagly(W, N, w, c)
2 for i =1 to N do
3 q
i
= c
i
/w
i
4 sortowanie tablic w, c i q wzgldem q (od najwikszego)
5 x=0;
6 i =1;
7 while x < W && i <= N do
8 // we tyle towaru i do plecaka ile wejdzie ;
9 x += min(w_i, Wx)
10 i ++;
11 end
12 end
Zoono: O(N log N) z powodu sortowania.
NJ (KIS) Algorytmy 138 / 222
Algorytmy plecakowe
Dyskretny problem plecakowy
Mamy plecak o pojemnoci W.
Mamy dany zbir N towarw. Kady towar ma swoj cen c
i
i
wielko w
i
.
Kady towar w
i
mona wzi lub nie wzi.
Suma wielkoci zaadowanych towarw nie moe przekracza W.
Warto zaadowanego plecaka ma by moliwie najwiksza.
Co rozwizuje problem?
Peny przegld moliwoci: O(2
N
)
Problem NP zupeny!
NJ (KIS) Algorytmy 139 / 222
Algorytmy plecakowe
Dynamiczne rozwizanie problemu dyskretnego
Rozwizanie pseudo-wielomianowe jest moliwe dziki pewnym
sprytnym zaoeniom. . .
Zamy, e W jest wartoci cakowit a take kade z wartoci w
i
jest cakowite.
Wtedy moemy inaczej spojrze na cao problemu:
Co zrobi moemy gdy mamy W
= 1 i jeden towar?
Co zrobi moemy gdy mamy W
= 2 i jeden towar?
Co zrobi moemy gdy mamy W
= 3 i jeden towar?
Co zrobi moemy gdy mamy W
= 1 i dwa towary?
Co zrobi moemy gdy mamy W
= 2 i dwa towary?
Co zrobi moemy gdy mamy W
= 3 i dwa towary?
NJ (KIS) Algorytmy 140 / 222
Algorytmy plecakowe
A(i ) najwiksza warto jak mona uzyska za pomoc plecaka o
pojemnoci i .
Mamy wtedy zaleno rekurencyjn:
A(0) = 0
A(i ) = maxc
j
+ A(i w
j
) : w
j
i
Wyznaczenie kolejno: A(0), A(1), . . . , A(W) rozwizuje zadanie w
zoonoci O(WN)
1 procedure PlecakDynamiczny1(W, N, w, c)
2 for i :=0 to W do
3 A[i ]:= 0
4
5 for i :=0 to W do
6 for j :=1 to N do
7 //czy j ty towar mieci si w plecaku o rozmiarze i
8 if ( w[j ] <= i ) then
9 A[ i ] = max(A[i], A[ i w[j]] + c[j ])
10 end
NJ (KIS) Algorytmy 141 / 222
Algorytmy plecakowe
A(i , j ) najwiksza warto jak mona uzyska za pomoc pierwszych
i towarw i plecaka o pojemnoci j .
Mamy wtedy zaleno rekurencyjn:
A(0, j ) = 0
A(i , 0) = 0
A(i , j ) = A(i 1, j ) jeli w
i
> j
A(i , j ) = max(A(i 1, j )
bez i
, c
i
+ A(i 1, j w
i
)
z i
) jeli w
i
j
NJ (KIS) Algorytmy 142 / 222
Algorytmy plecakowe
1 procedure PlecakDynamiczny2(W, N, w, c)
2 for i :=0 to N do
3 A[i ,0]:= 0
4 for j :=0 to W do
5 A[0, j ]:= 0
6
7 for i :=1 to N do
8 for j :=0 to W do
9 if ( w[i ] > j ) then
10 A[ i , j ] = A[i1,j]
11 else
12 A[ i , j ] = max(A[i1,j], A[ i 1,jw[i]] + c[ i ])
13 end
Zoono: O(NW)
NJ (KIS) Algorytmy 143 / 222
Algorytmy plecakowe
Dyskretny problem plecakowy II
Mamy plecak o pojemnoci W.
Mamy dany zbir N towarw. Kady towar ma swoj cen c
i
i
wielko w
i
.
Kady towar w
i
mona wzi lub nie wzi.
Suma wielkoci zaadowanych towarw musi by rwna W.
Warto zaadowanego plecaka ma by moliwie najwiksza.
Co rozwizuje problem?
Peny przegld moliwoci: O(2
N
)
Problem NP zupeny!
NJ (KIS) Algorytmy 144 / 222
Klasy zoonoci
Jzyki formalne
Alfabet zbir symboli (liter)
np.: = 0, 1
sowo puste
zbir wszystkich sw
np.:
)
L
= L L
2
L
3
. . ., gdzie
L
k
to k-krotna konkatenacja L z L.
NJ (KIS) Algorytmy 145 / 222
Klasy zoonoci
Jzyk i Problem decyzyjny
Niech Q bdzie problemem decyzyjnym:
Q :
0, 1
Wtedy moemy zdeniowa jzyk:
L = x
: Q(x) = 1
NJ (KIS) Algorytmy 146 / 222
Klasy zoonoci
Algorytm werykacji
deniowany jest jako algorytm o dwch argumentach.
Pierwszy to zwyke wejcie x (cig danych), a drugie to wiadectwo.
Algorytm werykuje cig x jeli istnieje wiadectwo y takie, e
A(x, y) = 1, czyli algorytm A werykuje x z pomoc wiadectwa y.
Jzyk L werykowany przez algorytm A to:
L = x 0, 1
: istnieje y 0, 1
, takie, e A(x, y) = 1
L skada si z takich sw x, dla ktrych istnieje y, ktre uyte przez A
daje mu moliwo werykacji przynalenoci x do L.
Jeli jaki x , L, to nie istnieje y za pomoc ktrego A zwerykowao by
pozytywnie x (a podsunicie faszywego wiadectwa y dla A te koczy
si klsk! Poniewa A potra werykowa).
NJ (KIS) Algorytmy 147 / 222
Klasy zoonoci
Problem cyklu Hamiltona
Cykl Hamiltona dla grafu nieskierowanego G to cykl prosty zawierajcy
wszystkie wierzchoki z V.
Problem cyklu Hamiltona to sprawdzenie czy G ma cykl Hamiltona.
Mona zdeniowa jzyk formalny:
GCH = G : G jest grafem z cyklem Hamiltona
jako zbir swgrafw, ktre posiadaj cykl Hamiltona.
Zadanie algorytmu mona wtedy widzie jako sprawdzenie czy dany
graf G naley do jzyka GCH, czyli czy posiada cykl Hamiltona.
NJ (KIS) Algorytmy 148 / 222
Klasy zoonoci
Natomiast zadaniem algorytmu werykacji jest sprawdzenie czy dla
grafu G i pewnego wiadectwa y, G jest grafem Hamiltonowskim. W
przypadku problemu grafu Hamiltonowskiego (zawierajcego cykl H.)
wiadectwem moe by lista wierzchokw cyklu H. (jeli istnieje . . . ).
Algorytm werykacji wtedy ma atwiejsze zadanie, werykuje tylko czy
wiadectwo jest prawdziwym cyklem dla danych, czyli grafu G. Co jest
ju prostym zadaniem (o zoonoci O(n
2
)).
NJ (KIS) Algorytmy 149 / 222
Klasy zoonoci
Klasy zoonoci, algorytmy werykacji i problemy
nierozstrzygalne
Klasy zoonoci problemw:
P problemy, dla ktrych daje si skonstruowa algorytm o
zoonoci wielomianowej (O(n
k
), kconst) wzgldem rozmiaru
zadania n. Problemy te nazywa si atwymi.
NP intuicyjnie: problemy, dla ktrych nie s znane algorytmy o
zoonoci wielomianowej (O(n
k
), kconst) wzgldem rozmiaru
zadania n.
Formalnie: Problemy dla ktrych istnieje algorytm werykacji
dziaajcy w czasie wielomianowym.
NJ (KIS) Algorytmy 150 / 222
Klasy zoonoci
Problemy NPzupene i NPtrudne
NPzupene. Podzbir problemw NP, ktre daj si redukowa do
innych nietrudniejszych problemw tej klasy w czasie
wielomianowym. Redukowa L
1
do L
2
(L
1
P
L
2
) oznacza
przeksztaca jeden problem w drugi w pewien formalny i
algorytmizowalny efektywnie (czas wielomianowy) sposb.
Formalnie L jest NPzupeny jeli:
1
L NP
2
L
NP
L
P
L
NPtrudne problemy ktre speniaj zaoenie 2 ale niekoniecznie
zaoenie 1.
NJ (KIS) Algorytmy 151 / 222
Klasy zoonoci
Klasy zoonoci cd.
Nie jest znana odpowied na pytanie: Czy P = NP?
Wiemy, e P NP
Wiemy, e NPC NP
Wikszo sdzi, e P ,= NP.
Z innej strony gdyby si nawet okazao, e P = NP, to stopie
wielomianu funkcji zoonoci byby i tak bardzo wielki (tak e
algorytm byby niepraktyczny. . . ).
NJ (KIS) Algorytmy 152 / 222
Klasy zoonoci
Problemy nierozstrzygalne
Problem nierozstrzygalny to taki problem dla ktrego nie tylko nie ma
szybkiego algorytmu, ale wrcz nie istnieje aden algorytm, ktry
rozwizuje dany problem.
Czy kto zna taki problem?
NJ (KIS) Algorytmy 153 / 222
Klasy zoonoci
Problem stopu:
Odpowiedzie na pytanie:
Czy dla algorytmu/programu A i danych x algorytm/program
skoczy swe dziaania.
Problem domina:
Majc skoczony zbir wzorw kafelkw i nieograniczon iloci
kai kadego wzoru odpowiedzie na pytanie: Czy da si takimi
kaami pokry dowoln powierzchni zachowujc kolory kai na
styku krawdzi.
Wdomino (paszczyzna rozstrzygalny, ppaszczyzna
nierozstrzygalny, obszar ograniczony rozstrzygalny)
Problem rwnowanoci skadniowej dwch jzykw.
NJ (KIS) Algorytmy 154 / 222
Klasy zoonoci
Inne problemy NP-zupene
Problem spenialnoci regu logicznych budowanych z bramek
ukadw (AND, OR, XOR, NOT), czy take spenialno regu
logicznych
Problem cieki i cyklu Hamiltona
Problem komiwojaera
Problem kliki
3-kolorowania grafu
Problem plecakowy na pene wypenienie okrelonej objtoci
podzbiorem towarw.
NJ (KIS) Algorytmy 155 / 222
Klasy zoonoci
Problem komiwojaera (problem NP-zupeny) i algorytmy
aproksymacyjne
Znale cykl o najmniejszym koszcie, ktry jest okrelony przez sum
wag krawdzi cyklu Hamiltona.
Mona udowodni, e problem jest NPzupeny pokazujc, e inne
problemy s redukowalne do znajdowania cyklu Hamiltona. To mona
sprowadzi do redukcji znajdowania cyklu Hamiltona do p. komiwojaera.
Dla problemw NPzupenych czsto by rozwiza je efektywnie
poszukuje si algorytmw ktrych rozwizanie nie jest optymalne lecz
przyblione do optymalnego w pewnym stopniu. Algorytmy
aproksymacyjne to caa ga algorytmw, ktrych celem jest
poszukiwanie efektywnych algorytmw przybliajcych rozwizania
problemw NPtrudnych moliwie jak najlepiej, i nie rzadko z pewnymi
gwarancjami.
NJ (KIS) Algorytmy 156 / 222
Klasy zoonoci
Dla praktycznych problemw, gdy wierzchoki s punktami przestrzeni
Euclidesowej koszt krawdzi moe by zdeniowany przez zwyk
odlego Euclidesow.
Mona skorzysta z algorytmu Primy do wyznaczenia minimalnego
drzewa rozpinajcego. Wtedy algorytm moe wyglda jak poniej.
1 procedure TSPPrima(G,c)
2 r:= wybierz wierzchoek korze ;
3 T:=MSTPrima(G,r);
4 niech L bdzie list wierzchokw
5 drzewa rozpinajcego T w kolejnoci preorder
6 return cykl zoony z wierzchokw znajdujcych
7 si w kolejnoci jak w L.
8 end
NJ (KIS) Algorytmy 157 / 222
Klasy zoonoci
Preorder wywietla wierzchoki zgodnie z kolejnoci odwiedzin danego
wierzchoka w drzewie T.
Algorytm TSP-Prima znajduje cykl, ktry jest nieduszy ni
2-krotno optymalnej drogi komiwojaera.
NJ (KIS) Algorytmy 158 / 222
Wyszukiwanie wzorca
Wyszukiwanie wzorca
Dane: alfabet , tablica T[1..n], tablicawzorzec P[1..m], wartoci
tablic T i P s elementami alfabetu .
Problem: Czy P jest podcigiem T, tj. czy istnieje s takie, e:
T[s + 1..s + m] = P[1..m]
T[s + i ] = P[i ] i = 1, . . . , m
NJ (KIS) Algorytmy 159 / 222
Wyszukiwanie wzorca
Prosty algorytm wyszukiwania wzorca
1 procedure SzukajWzoraca(P,T)
2 n:=lenght(T);
3 m:=length(P);
4 for s=0 to nm do
5 if T[s+1..s+m] = P[1..m] then
6 return s ;
7 return 1; {brak wzorca}
8 end
Czas dziaania wiersza 5 (m). Implementacja powinna sprawdza do
pierwszej rnej pary.
cznie czas: ((n m + 1)m).
NJ (KIS) Algorytmy 160 / 222
Wyszukiwanie wzorca Algorytm Rabina-Karpa
Algorytm Rabina-Karpa I
Bardzo dobrze zachowuje si rednio (w praktyce)
Cho jego pesymistyczna zoono te wynosi O((n m + 1)m)
Zamy, e na alfabet skadaj si cyfry 0, 1, . . . , 9 (algorytm
atwo uoglni na dowolny alfabet).
Wtedy T[s +1..s +m] mona interpretowa jako liczb dziesitn t
s
(dla innego alfabetu moe to by liczba w pewnym innym systemie).
Podobnie P[1..m] moe by widziane jako liczba dziesitna p.
Wartoci takich liczb mona wyznacza w czasie O(m):
p = P[m]+10(P[m1]+10(P[m2]+. . . +10(P[2]+10P[1]) . . .))
NJ (KIS) Algorytmy 161 / 222
Wyszukiwanie wzorca Algorytm Rabina-Karpa
Algorytm Rabina-Karpa II
atwo zauway, e na podstawie t
s
mona szybko obliczy t
s+1
:
t
s+1
= 10(t
s
10
m1
T[s + 1]) + T[s + m + 1]
Aby uoglni wystarczy w miejsce 10 wpisa podstaw d.
Np.:
t
s
= 1234,
m = 4,
T[s + 1] = 5,
wtedy
t
s+1
= 10(1234 10
3
) + 5 = 2345
NJ (KIS) Algorytmy 162 / 222
Wyszukiwanie wzorca Algorytm Rabina-Karpa
Warto zauway, e koszt wyznaczenia p to O(m), take koszt t
i
to
O(m). Cho koszt wyznaczenia wszystkich t
i
ogranicza si do
O(n + m).
Problem gdy m jest nie (bardzo) mae, a to trzeba wkalkulowa.
Rozwizaniem jest liczenie p i t
s
modulo q dla odpowiednio
dobranej wartoci q.
Po co? Jeli (p MOD q) ,= (t
s
MOD q) to nie ma szans, aby
P = T[s + 1..s + m]!
Jak wybra q?
Liczba pierwsza, dla ktrej 10q mieci si w sowie komputera.
Dlaczego tak?
NJ (KIS) Algorytmy 163 / 222
Wyszukiwanie wzorca Algorytm Rabina-Karpa
Co daje nowy wzr na t
s+1
:
t
s+1
= (d(t
s
h T[s + 1]) + T[s + m + 1]) MOD q,
gdzie h = d
m1
MOD q odpowiada warto jedynki na
najwyszej pozycji (porwnaj wzr poprzedni).
UWAGA(!) Jednak po takich zmianach to, e t
s
= p MOD q nie
implikuje, e P = T[s + 1..s + m]. W takim przypadku trzeba
jednak sprawdzi czy rzeczywicie P = T[s + 1..s + m]
tradycyjnie. . .
NJ (KIS) Algorytmy 164 / 222
Wyszukiwanie wzorca Algorytm Rabina-Karpa
1 procedure SzukajWzoracaRabinKarp(P,T,d,q)
2 begin
3 n:=lenght(T);
4 m:=length(P);
5 h:=d
m1
MOD q;
6 p:=0;
7 t
0
:=0;
8
9
10 for i =1 to m do
11 begin
12 p:=(dp+P[i]) MOD q;
13 t
0
:=(dt
0
+T[i]) MOD q;
14 end
15
16
17
NJ (KIS) Algorytmy 165 / 222
Wyszukiwanie wzorca Algorytm Rabina-Karpa
18 for s=0 to nm do
19 begin
20 if p=t
s
then
21 if T[s+1..s+m] = P[1..m] then
22 return s ;
23 if s<mn then
24 t
s+1
:=(d(t
s
hT[s+1]) +T[s+m+1]) MOD q;
25 end
26 return 1; {brak wzorca}
27 end
NJ (KIS) Algorytmy 166 / 222
Wyszukiwanie wzorca Algorytm Rabina-Karpa
Zoono
w.4 i 812 O(m)
w.18 O(m)
Razem: O((n m + 1n)m).
Natomiast oczekiwany czas tego algorytmu to O(n + m).
Algorytm o wiele bardziej godny polecenia!!!
NJ (KIS) Algorytmy 167 / 222
Wyszukiwanie wzorca Algorytm KnuthaMorrisaPratta
Algorytm KnuthaMorrisaPratta
W stron algorytmu o zoonoci (n + m).
Funkcja preksowa wzorca P.
Cel: unikanie pustego/straconego szukania stosowanego w algorytmie
naiwnym.
NJ (KIS) Algorytmy 168 / 222
Wyszukiwanie wzorca Algorytm KnuthaMorrisaPratta
T = b a c b a b a b a a b c b a b
P = a b a b a c a
-- s --- x
--- q ---
T = b a c b a b a b a a b c b a b
P = a b a b a c a
----- s ---- x
- k -
a b a b a
a b a
Szukanie minimalnego przesunicia s
+ 1 .. s
+ k]
s
= s + (q k) to dobry skok!
Funkcj preksingu deniujemy poprzez:
[q] = arg max
k<q
P
k
P
q
P
k
P
q
oznacza, e P
k
jest suksem P
q
(dla prexem).
Jak wida [q] zale tylko od P!
i [q] < q
NJ (KIS) Algorytmy 170 / 222
Wyszukiwanie wzorca Algorytm KnuthaMorrisaPratta
i 1 2 3 4 5 6 7 8 9 10
P[i] a b a b a b a b c a
pi[i] 0 0 1 2 3 4 5 6 0 1
Dla q = 8, 6, 4, 2 otrzymujemy:
P
8
a b a b a b a b c a
P
6
a b a b a b a b c a
P
4
a b a b a b a b c a
P
2
a b a b a b a b c a
P
0
a b a b a b a b c a
NJ (KIS) Algorytmy 171 / 222
Wyszukiwanie wzorca Algorytm KnuthaMorrisaPratta
[q] = q, [q],
2
[q], . . . ,
t
[q]
i
[q] =
q i = 0
[
i 1
[q]] i > 0
[8] = 8, 6, 4, 2, 0
[q] = k : P
k
P
q
[q 1] P[k + 1] = P[q]
Oczywicie: E
q1
[q 1]
E
q1
zbir takich k, e P
k
P
q1
i P
k+1
P
q
czyli P
k
daje si
rozszerzy do P
k+1
i jest suksem P
q
.
[q] =
0 E
q1
=
1 + maxk E
q1
NJ (KIS) Algorytmy 173 / 222
Wyszukiwanie wzorca Algorytm KnuthaMorrisaPratta
1 procedure SzukajWzoracaKMP(P,T)
2 n:=lenght(T);
3 m:=length(P);
4 :=ComputePrex(P);
5 k:=0;
6 for q=1 to n do
7 begin
8 while k>0 AND P[k+1]<>T[q] do
9 k:=[k];
10 if P[k+1]=T[q] then
11 k:=k+1;
12 if k=m then
13 Output qm; { return qm; }
14 k:=[k];
15 end
16 end
NJ (KIS) Algorytmy 174 / 222
Wyszukiwanie wzorca Algorytm KnuthaMorrisaPratta
1 procedure ComputePrex(P);
2 m:=length(P);
3 [1]:=0;
4 k:=0;
5 for q=2 to m do
6 begin
7 while k>0 AND P[k+1]<>P[q] do
8 k:=[k];
9 if P[k+1]=P[q] then
10 k:=k+1;
11 [q]:=k;
12 end
13 return ;
14 end
NJ (KIS) Algorytmy 175 / 222
Automaty i wyraenia regularne Automaty skoczone
Automaty skoczone
Automaty skoczone reprezentowane s poprzez grafy o skoczonej
liczbie wierzchokw i pewnej liczbie krawdzi.
Wierzchoki odpowiadaj stanom automatu a krawdzie
odpowiadaj za przejcia pomidzy stanem z ktrego prowadzi dana
krawd i stanem do ktrego prowadzi ta krawd. Krawdzie s
etykietowane pojedynczymi literami bd podzbiorem liter pewnego
alfabetu .
0 1
1
1
NJ (KIS) Algorytmy 176 / 222
Automaty i wyraenia regularne Automaty skoczone
Dziaanie automatu polega na przechodzeniu przez stany automatu
zgodnie ze sowem wejciowym (dane wejciowe) i ukadem stanw i
przej pomidzy nimi (czyli krawdziami w grae).
Automat zaczyna prac w stanie pocztkowym (czsto oznaczonym
przez 0).
Nastpnie zgodnie z pierwsz liter wyrazu nastpuje przejcie ze
stanu zerowego do takiego stanu, do ktrego prowadzi krawd
zaetykietowana przez pierwsz liter wyrazu. Po czym
kontynuowany jest taki proces, czyli pobierana jest nastpna litera
wyrazu i automat przechodzi do takiego stanu, do ktrego da si
przej wanie z tak liter alfabetu.
0 1 2 3
a b
c
a b c
NJ (KIS) Algorytmy 177 / 222
Automaty i wyraenia regularne Automaty skoczone
Automat koczy prac, gdy przeanalizuje cae zadane sowo
wejciowe lub zabraknie przej dla danych par stanlitera (automat
przechodzi z pewnego stanu q z liter l ). Gdyby zabrako przej
sowo wejciowe nie bdzie zaakceptowane.
Stany automatu dzielimy na stany akceptujce i nieakceptujce.
Zadaniem automatu jest zaakceptowanie bd nie zaakceptowanie
danego sowa wejciowego. Mianowicie, gdy automat skoczy prac
w stanie akceptujcym oznacza to, e sowo jest akceptowane
(rozpoznawane) przez automat skoczony. W przeciwnym wypadku
sowo nie jest akceptowane (nie jest rozpoznawane).
Kady automat skoczony rozpoznaje wyrazy, ktre nale do
pewnego jzyka L nad alfabetem .
NJ (KIS) Algorytmy 178 / 222
Automaty i wyraenia regularne Automaty skoczone
A = Q, , , q
0
, F
Q zbir stanw
alfabet (zbir symboli)
: Q Q funkcja przejcia
q
0
stan pocztkowy
F Q zbir stanw akceptujcych
Q to wierzchoki grafu
deniuje krawdzie:
0 1
1
1
q l q
0 1 1
0 1 0
NJ (KIS) Algorytmy 179 / 222
Automaty i wyraenia regularne Automaty skoczone
sowa w ktrych wystpuje a pniej jest te b i pniej jest i c
....a....b....c
0 1 2 3
a b
c
a b c
sowa, ktre rozpoczynaj si na a i kocz na b
0 1 2
a
b
b
b
b
NJ (KIS) Algorytmy 180 / 222
Automaty i wyraenia regularne Automaty skoczone
wyrazy rozpoczynajce si od ab
0 1 2
a b