You are on page 1of 46

Wstęp

Algorytmy i struktury danych 2

Tomasz M. Gwizdałła

Tomasz M. Gwizdałła ASD2


Wstęp

Wykładowca

Tomasz Gwizdałła
Katedra Systemów Inteligentnych WFIS UŁ
Pomorska 149/153, p.423B

tel: 6355709
e-mail: tomasz.gwizdalla@uni.lodz.pl
http://http://old.wfis.uni.lodz.pl/staff/tgwizdalla/

Tomasz M. Gwizdałła ASD2


Wstęp

Motto

Algorithmics is more than a branch of computer science. It is the


core of computer science, and, in all fairness, can be said to be
relevant to most of science, business, and technology.

David Harel, Algorithmics, The Spirit of Computing

Tomasz M. Gwizdałła ASD2


Wstęp

Prawdopodobny plan wykładu

1 Grafy i algorytmy grafowe 9

2 Algorytmy geometryczne 26

3 Wyszukiwanie wzorca 36

4 Algorytmy arytmetyczne 43

Tomasz M. Gwizdałła ASD2


Wstęp

Literatura

L. Banachowski, K. Diks, W. Rytter Algorytmy i struktury


danych
T.H.Cormen, C.E.Leiserson, R.L.Rivest Wprowadzenie do
algorytmów
N.Wirth Algorytmy + struktury danych = programy
A.V.Aho, J.E.Hopcroft, J.D.Ullman Projektowanie i analiza
algorytmów komputerowych
R. Sedgewick Algorytmy w C++

D.E.Knuth Sztuka programowania


D. Harel Rzecz o istocie informatyki
J. Bentley Perełki oprogramowania

Tomasz M. Gwizdałła ASD2


Wstęp

Egzamin

Egzamin obejmuje treści II i IV semestru.

Warunkiem dopuszczenia do egzaminu jest posiadanie


zaliczenia.

Tomasz M. Gwizdałła ASD2


Wstęp

Zaliczenie - studia stacjonarne

Na ocenę dostateczną:
Zależy od prowadzącego, na ocenę wpływ mają:
obecność - 14 pkt. (∼ 18%)
aktywność - 14 pkt. (∼ 18%)
zadania podstawowe oddawane w terminie - 50 pkt. (∼ 64%)
Próg 60%.
projekt ratunkowy - 15 pkt.

Na oceny wyższe:
Ponad 80% - 3+, Ponad 90% - 4.
Wykonywane samodzielnie, krótkie projekty podawane przez
wykładowcę.

Tomasz M. Gwizdałła ASD2


Wstęp

Zaliczenie - studia niestacjonarne

Na ocenę dostateczną:
Zależy od prowadzącego, na ocenę wpływ mają:
obecność - 6 pkt. (∼ 14%)
aktywność - 6 pkt. (∼ 14%)
zadania podstawowe oddawane w terminie - 30 pkt. (∼ 72%)
Próg 60%.
projekt ratunkowy - 10 pkt.

Na oceny wyższe:
Ponad 80% - 3+, Ponad 90% - 4.
Wykonywane samodzielnie, krótkie projekty podawane przez
wykładowcę.

Tomasz M. Gwizdałła ASD2


Grafy

Notes

Grafy

Tomasz M. Gwizdałła

Grafy
Pojęcia
Notes

Definicja

Grafem nazywamy strukturę G = (V , E ) składającą się z węzłów


(wierzchołków, oznaczanych przez V ) wzajemnie połączonych za
pomocą krawędzi (oznaczanych przez E ).

Grafy
Pojęcia
Klasyfikacja Notes

graf nieskierowany graf skierowany


(niezorientowany) (zorientowany, digraf)
Krawędź - para wierzchołków grafu.

krawędzie mogą łączyć


krawędzie łączą wierzchołki w
wierzchołki tylko w jednym
obu kierunkach
kierunku

Grafy
Pojęcia
Definicje Notes

I Rząd grafu - liczba wierzchołków grafu

I Rozmiar grafu - liczba krawędzi grafu

I Jeśli krawędź łączy dwa wierzchołki to jest z nimi incydentna


(krawędź incydentna może mieć w wierzchołku początek lub
koniec)

I Sąsiad - dwa wierzchołki są sąsiadami, jeśli istnieje krawędź


pomiędzy nimi

I Pętla własna - krawędź łącząca wierzchołek z samym sobą


Grafy
Pojęcia
Definicje Notes

I Stopień wierzchołka
I w grafie nieskierowanym - liczba jego sąsiadów
I w grafie skierowanym - rozróżniamy stopień wejsciowy (liczbę
krawędzi, dla których dany wierzchołek jest pierwszym w
parze) i wyjsciowy (liczbę krawędzi, dla których dany
wierzchołek jest drugim w parze)

I Podgraf grafu G - graf, którego wierzchołki stanowią


podzbiór zbioru wierzchołków G (nadgrafu) , a krawędzie
podzbiór zbioru krawędzi G zawierający wszystkie krawędzie
incydentne do podzbioru wierzchołków

I Graf pełny - graf, którego każdy wierzchołek jest połączony


krawędzią z każdym innym (Kn )

I Klika - pełny podgraf grafu

Grafy
Pojęcia
Definicje Notes

I Acentryczność wierzchołka - maksymalna z odległości tego


wierzchołka do innych wierzchołków grafu (eccentricity,
ekscentrycznoć)

I Promień grafu - najmniejsza acentryczność wierzchołka


wśród wszystkich wierzchołków grafu

I Średnica grafu - największa acentryczność wierzchołka wśród


wszystkich wierzchołków grafu.

Grafy
Pojęcia
Definicje Notes

I Ścieżka - ciąg wierzchołków, w którym każdy wierzchołek jest


sąsiadem zarówno poprzedniego, jak i następnego

I Ścieżka prosta - ścieżka, w której żaden z wierzchołków nie


powtarza się

I Jeśli od każdego wierzchołka grafu istnieje ścieżka do


dowolnego innego, to graf jest spójny

I Cykl Jest to ścieżka, która zaczyna się i kończy w tym samym


wierzchołku (graf cykliczny/acykliczny)

I Drzewo - spójny graf acykliczny

Grafy
Pojęcia
Definicje Notes

I Graf planarny - graf, który można przedstawić (dla którego


istnieje graf izomorficzny) na płaszczyźnie tak, by żadne dwie
krawędzie się nie przecinały
I Graf płaski - izomorficzne przedstawienie grafu takie, że
żadne dwie krawędzie się nie przecinają
I Graf dwudzielny - graf, który może być podzielony na dwa
podgrafy takie, że nie istnieje żadna krawędź łącząca dwa
wierzchołki tego samego podgrafu
I Klika dwudzielna - graf dwudzielny taki, że pomiędzy
wszystkimi parami wierzchołków należących do różnych
podgrafów istnieje krawędź (Kn,m )
I W grafie planarnym nie może występować podgraf
homeomorficzny z K5 lub K3,3
Grafy
Pojęcia
Definicje Notes

I Graf r -regularny - graf, w którym każdy wierzchołek ma taki


sam stopień (r )

I Krawędzie równoległe (wielokrotne) - krawędzie łączące te


same pary wierzchołków

I Krawędzie sąsiednie - krawędzie kończące się w jednym


wierzchołku

I Graf prosty - to graf bez pętli własnych i krawędzi


równoległych

Grafy
Pojęcia
Definicje Notes

I Graf ważony - graf, w którym z każdą krawędzią związana


jest pewna liczba, zwana wagą (długością)

I Niezmiennik grafu - to liczba lub ciąg liczb, który zależy


tylko od struktury grafu a nie od sposobu jego
poetykietowania (np. liczba wierzchołków, liczba krawędzi)

I Liczba chromatyczna grafu - to najmniejsza liczba kolorów


potrzebnych do pokolorowania wierzchołków grafu tak, by
żadne dwa przyległe wierzchołki nie były tego samego koloru

Grafy
Pojęcia
Ciekawostki Notes

Twierdzenie o czterech kolorach

Dla każdego skończonego grafu planarnego możliwe jest


przypisanie każdemu z jego wierzchołków jednej z czterech liczb 1,
2, 3 i 4 w taki sposób, aby żadne sąsiednie wierzchołki nie miały
przyporządkowanej tej samej liczby
Dowolną mapę polityczną na płaszczyźnie lub sferze można
zabarwić czterema kolorami tak, aby każde dwa kraje mające
wspólną granicę (a nie tylko wspólny wierzchołek) miały inne kolory

Dowód:
Appel and W. Haken - 1976 (prawie 2000 przypadków szczególnych)

N. Robertson, D. Sanders, P. Seymour, R. Thomas -1994

Grafy
Pojęcia
Implementacje Notes

Macierz sąsiedztwa
Niech nV będzie liczbą wierzchołków, nE - krawędzi
Budujemy tablicę nV × nV wypełniając ją zerami, jeśli wierzchołki
nie są sąsiadami, jedynkami, jeśli są

A B C D E A B C D E

A 0 1 1 0 1 A 0 1 1 0 1
B 1 0 1 1 0 B 0 0 1 1 0
C 1 1 0 1 1 C 0 0 0 1 0
D 0 1 1 0 1 D 0 1 0 0 1
E 1 0 1 1 0 E 1 0 1 0 0

Złożoność pamięciowa - O(nV2 )


Grafy
Pojęcia
Implementacje Notes

Lista incydencji

Dla każdego wierzchołka tworzymy listę, na której przechowujemy


zbiór wierzchołków z nim połączonych

A: B, C, E A: B, C, E
B: A, C, D B: C, D
C: A, B, D, E C: D
D: B, C, E D: B, E
E: A, C, D E: A, C
Złożoność pamięciowa - O(nV + nE )

Grafy
Pojęcia
Implementacje Notes

Lista krawędzi

Lista, na której przechowujemy wszystkie krawędzie


A-B, A-C, A-E,
A-B, A-C,
B-A, B-C, B-D,
A-E, B-C,
C-A, C-B, C-D,
B-D, C-D,
C-E, D-B, D-C,
D-B, D-E,
D-E, E-A, E-C
E-A, E-C
E-D
Złożoność pamięciowa - O(nE )

Grafy
Pojęcia
Implementacje Notes

Macierz incydencji
W wierszach macierzy zapisujemy krawędzie, w kolumnach
wierzchołki. Wypełniamy wartościam1 {−1, 1, 2(pętla własna)}

A B C D E A B C D E

A-B -1 1 0 0 0 A-B -1 1 0 0 0
A-C -1 0 1 0 0 A-C -1 0 1 0 0
A-E -1 0 0 0 0 A-E -1 0 0 0 0
B-A 1 -1 0 0 0 B-C 0 -1 1 0 0
E-A 1 0 0 0 -1 E-A 1 0 0 0 -1

Złożoność pamięciowa - O(nV ∗ nE )

Grafy
Algorytmy
Przeszukiwania i sortowania Notes

DFS

Algorithm: Depth First Search - przeszukiwanie grafu w głąb

Procedure DFS(long i)
if wierzchołek i nie jest odwiedzony then
zaznacz wierzchołek i jako odwiedzony
for wszyscy sąsiedzi wierzchołka i do
wywołaj DFS dla sąsiada
end for
end if

Kolejność odwiedzania wierzchołków: A, B, C, D, E


Grafy
Algorytmy
Przeszukiwania i sortowania Notes

BFS
Algorithm: Breadth First Search - przeszukiwanie grafu wszerz
Procedure BFS(start)
node list nl;
nl.add(start);
while nl nie jest pusta do
pobierz pierwszy wierzchołek (v ) z listy nl i oznacz go jako
odwiedzony
for wszyscy sąsiedzi w wierzchołka v do
if w nie jest odwiedzony then
ustaw odległość w jako odległość v +1
dodaj sąsiada na listę
end if
end for
usuń v z listy
end while
Kolejność odwiedzania wierzchołków: A, B, C, E, D

Grafy
Algorytmy
Przeszukiwania i sortowania Notes

Najkrótsza ścieżka
Algorithm: Szukanie najkrótszej ścieżka od zadanego
wierzchołka do wszystkich pozostałych - bazujące na BFS
Procedure Shortest path(start)
node list nl;
nl.add(start);
while nl nie jest pusta do
pobierz pierwszy wierzchołek (v ) z listy nl i oznacz go jako
odwiedzony
for wszyscy sąsiedzi w wierzchołka v do
if w nie jest odwiedzony then
ustaw odległość w jako odległość v +1
dodaj sąsiada na listę
end if
end for
usuń v z listy
end while

Grafy
Algorytmy
Przeszukiwania i sortowania Notes

Sortowanie topologiczne
Jest to takie sortowanie wierzchołków grafu, że w posortowanej
strukturze zachowana jest kolejność wynikająca ze skierowania
krawędzi, tzn. wierzchołek, który dla dowolnej krawędzi jest
wierzchołkiem początkowym występuje w strukturze przed
wierzchołkiem końcowym.
Aby w grafie można było przeprowadzić sortowanie topologiczne,
musi on być grafem skierowanym, acyklicznym.

Grafy
Algorytmy
Przeszukiwania i sortowania Notes

Sortowanie topologiczne - algorytm Kahna


Procedure Kahn
utwórz pustą listę (Lout ), która będzie zawierać strukturę
posortowaną
utwórz listę (Lin ) wierzchołków bez krawędzi wchodzących
while Lin niepusta do
pobierz węzeł v z Lin , usuwając go
zapisz go na Lout
for wszystkie krawędzie incydentne do v do
usuń krawędź
if sąsiad nie posiada krawędzi wchodzących then
dodaj do Lin
end if
end for
end while
jeśli graf posiada krawędzie - istnieją cykle, czyli sortowanie
topologiczne jest niemożliwe
Grafy
Algorytmy
Przeszukiwania i sortowania Notes

Sortowanie topologiczne - algorytm bazujący na DFS


Procedure ST on DFS()
for wszystkie wierzchołki v w grafie do
uruchom ST on DFS(v )
end for
stos pomocniczy S zawiera strukturę wierzchołków posortowanych
topologicznie, o ile jego rozmiar jest równy liczbie wierzchołków

Procedure ST on DFS(v )
zaznacz wierzchołek v jako odwiedzony
for wszyscy sąsiedzi w wierzchołka v do
if w nie jest odwiedzony then
wywołaj ST on DFS(w )
end if
dodaj v do stosu pomocniczego S
end for

Grafy
Algorytmy
MST Notes

Minimalne drzewo rozpinające


MST (Minimum Spanning Tree)
Rozważmy graf nieskierowany, spójny, ważony.
Podzbiór T zbioru krawędzi E, łączący wszystkie wierzchołki oraz
taki, że suma wag krawędzi zbioru T jest najmniejsza nazywamy
minimalnym drzewem rozpinającym.

Grafy
Algorytmy
MST Notes

Algorytm Kruskala
Algorytm Kruskala znajdowania MST jest algorytmem zachłannym
I Posortuj wszystkie krawędzie w rosnącym porządku wag
I Wybieraj po kolei krawędzie z tak posortowanej listy
I Krawędź może:
I łączyć wierzchołki nienależące do żadnego poddrzewa -
tworzymy nowe poddrzewo
I łączyć wierzchołki, z których tylko jeden należy do pewnego
poddrzewa - powiększamy to poddrzewo
I łączyć wierzchołki należące do dwóch różnych poddrzew -
scalamy je
I łączyć wierzchołki należące do tego samego poddrzewa - nie
bierzemy jej pod uwagę
I Kiedy wszystkie węzły należą do jednego drzewa, zatrzymaj

Grafy
Algorytmy
MST Notes

Algorytm Kruskala

AE: 1
AF: 2
BE: 2
DE: 3
AB: 4
BC: 5
FD: 6
EF: 7
CD: 8
Grafy
Algorytmy
MST Notes

Algorytm Kruskala

AE: 1
AF: 2
BE: 2
DE: 3
AB: 4
BC: 5
FD: 6
EF: 7
CD: 8

Grafy
Algorytmy
MST Notes

Algorytm Kruskala

AE: 1
AF: 2
BE: 2
DE: 3
AB: 4
BC: 5
FD: 6
EF: 7
CD: 8

Grafy
Algorytmy
MST Notes

Algorytm Kruskala

AE: 1
AF: 2
BE: 2
DE: 3
AB: 4
BC: 5
FD: 6
EF: 7
CD: 8

Grafy
Algorytmy
MST Notes

Algorytm Kruskala

AE: 1
AF: 2
BE: 2
DE: 3
AB: 4
BC: 5
FD: 6
EF: 7
CD: 8
Grafy
Algorytmy
MST Notes

Algorytm Kruskala

AE: 1
AF: 2
BE: 2
DE: 3
AB: 4
BC: 5
FD: 6
EF: 7
CD: 8

Grafy
Algorytmy
MST Notes

Algorytm Prima

Algorytm Prima znajdowania MST jest algorytmem zachłannym


I Wybierz dowolny wierzchołek
I Dla istniejącego drzewa powtarzaj
I Utwórz posortowaną ze względu na wagi listę krawędzi
wychodzących z wierzchołków drzewa
I Dodaj do drzewa gałąź o najmniejszej wadze (o ile jest ona
incydentna do wierzchołka, którego nie ma jeszcze w drzewie)

Grafy
Algorytmy
MST Notes

Algorytm Prima

Wybierzmy jako początkowy wierzchołek D

DE: 3
DF: 6
DC: 8

Grafy
Algorytmy
MST Notes

Algorytm Prima

EA: 1
EB: 2
DF: 6
EF: 7
DC: 8
Grafy
Algorytmy
MST Notes

Algorytm Prima

AF: 2
EB: 2
AB: 4
DF: 6
EF: 7
DC: 8

Grafy
Algorytmy
MST Notes

Algorytm Prima

EB: 2
AB: 4
DF: 6
EF: 7
DC: 8

Grafy
Algorytmy
MST Notes

Algorytm Prima

AB: 4
BC: 5
DF: 6
EF: 7
DC: 8

Grafy
Algorytmy
Odległości Notes

Algorytmy wyznaczania najmniejszej odległości od ustalonego


wierzchołka do wszystkich pozostałych w grafie skierowanym

I Algorytm Dijkstry.
I Algorytm Forda-Bellmana
I Algorytm Floyda-Warshalla
I A* (A-star, A-gwiazdka)

Rozważmy graf skierowany, spójny, ważony


Grafy
Algorytmy
Odległości Notes

Algorytm Dijkstry

Algorytm Dijkstry jest algorytmem zachłannym


I Wybierz wierzchołek, utwórz tablicę odległości do pozostałych
wierzchołków
I Wybierz wierzchołek o najmniejszej odległości

I Zmodyfikuj tablicę odległości uwzględniając wagi krawędzi


wychodzących z dodanego wierzchołka
I Powtarzaj tak długo, aż wszystkie wierzchołki będą
uwzględnione

Grafy
Algorytmy
Odległości Notes

Algorytm Dijkstry

Graf nie może zawierać krawędzi o wagach ujemnych.


Jako początkowy wybierzmy wierzchołek A

Grafy
Algorytmy
Odległości Notes

Algorytm Dijkstry

d(A) d(B) d(C) d(D) d(E)


{A} x 4 5 ∞ 1

Grafy
Algorytmy
Odległości Notes

Algorytm Dijkstry

d(A) d(B) d(C) d(D) d(E)


{A} x 4 5 ∞ 1
{A,E} x 4 3 ∞ x
d(A) d(B) d(C) d(D) d(E)
d(A-w) x 4 5 ∞ 1
d(A-E-w) x ∞ 3 ∞ x
Grafy
Algorytmy
Odległości Notes

Algorytm Dijkstry

d(A) d(B) d(C) d(D) d(E)


{A} x 4 5 ∞ 1
{A,E} x 4 3 ∞ x
{A,C,E} x 4 x 7 x

Grafy
Algorytmy
Odległości Notes

Algorytm Dijkstry

d(A) d(B) d(C) d(D) d(E)


{A} x 4 5 ∞ 1
{A,E} x 4 3 ∞ x
{A,C,E} x 4 x 7 x
{A,B,C,E} x x x 5 x

Grafy
Algorytmy
Odległości Notes

Algorytm Forda-Bellmana

I Graf nie może zawierać cykli o długości ujemnej

I Algorytm Forda Bellmana jest algorytmem zachłannym

I Wychodząc od początkowego wierzchołka analizujemy


długość dróg
I Są dwie wersje algorytmu o różnych złożonościach
I O(nV ∗ nE )
I O(nV3 )

Grafy
Algorytmy
Odległości Notes

Algorytm Forda-Bellmana

Tworzymy tablicę wag

A B C D E
A 0 4 5 ∞ 1
B ∞ 0 2 1 ∞
C ∞ ∞ 0 4 ∞
D ∞ 2 ∞ 0 3
E 6 ∞ 2 ∞ 0
Grafy
Algorytmy
Odległości Notes

Algorytm Forda-Bellmana

Analizujemy tablicę odległości od wierzchołka A

A B C D E
1 0 4 5 ∞ 1

AB(4), AC(5), AE(1), BC(2), BD(1),


CD(4), DB(2), DE(3), EA(6), EC(2)
A B C D E
2 0 4 3 5 1

Grafy
Algorytmy
Odległości Notes

Algorytm Floyda-Warshalla

I Algorytm ten służy do wyznaczania najmniejszej odległości


pomiędzy wszystkimi parami wierzchołków
I Stosuje się go do grafów skierowanych bez cykli o długości
ujemnej
I Opiera się na technice podobnej do algorytmu Forda-Bellmana

I dij0 = wij
I dijk+1 = min(dijk , di,k+1
k k
+ di+1,k )

Grafy
Algorytmy
Odległości Notes

Algorytm Floyda-Warshalla

Rozważmy znany graf

W algorytmie Floyda-Warshalla
wychodzimy z tablicy wag, jako
najmniejszych odległości w przybliżeniu
”zerowym”, po czym modyfikujemy ją
dla kolejnych wierzchołków w oparciu o
dane dla wierzchołków rozpatrywanych
wcześniej

Grafy
Algorytmy
Odległości Notes

Algorytm Floyda-Warshalla

A B C D E A B C D E
A 0 4 5 ∞ 1 A 0 4 5 5 1
B ∞ 0 2 1 ∞ B ∞ 0 2 1 ∞
C ∞ ∞ 0 4 ∞ C ∞ ∞ 0 4 ∞
D ∞ 2 ∞ 0 3 D ∞ 2 4 0 3
E 6 10 2 ∞ 0 A B C D E E 6 10 2 6 0
A 0 4 5 5 1
B ∞ 0 2 1 ∞
C ∞ ∞ 0 4 ∞
D ∞ 2 4 0 3
E 6 10 2 11 0
Grafy
Algorytmy
Odległości Notes

Algorytm Floyda-Warshalla

A B C D E A B C D E
A 0 4 5 5 1 A 0 4 3 5 1
B ∞ 0 2 1 4 B 10 0 2 1 4
C ∞ 6 0 4 7 C 13 6 0 4 7
D ∞ 2 4 0 3 D 9 2 4 0 3
E 6 8 2 6 0 E 6 8 2 6 0

Grafy
Algorytmy
Odległości Notes

Algorytm A*, znajomy graf

Grafy
Algorytmy
Odległości Notes

Szukanie najkrótszej drogi

Znajdźmy najkrótszą drogę od węzła O do węzła Z

Najkrótsza droga to O-P-Z (395 km).

Jak odtworzymy ją używając algorytmu Dijkstry?

Zanim uzyskamy odległość do węzła Z będziemy musieli przeanalizować


wszystkie węzły, do których odległość jest mniejsza, niż do Z, czyli:
D(82), S(96), K(156), E(168), P(203), T(220), F(221), W(283),
C(303), R(304), L(362)

Grafy
Algorytmy
Odległości Notes

A*, czyli dodajemy heurystykę


Próbujemy wzbogacić naszą wiedzę o jakąś ocenę odległości od pomiędzy
wierzchołkiem, do którego właśnie dotarliśmy oraz wierzchołkiem
docelowym.

Na przykład zapiszmy współrzędne geograficzne wierzchołków,


potraktujmy je jako współrzędne euklidesowe na płaszczyźnie i
zastosujmy przelicznik minuta kątowa = kilometr

Za każdym razem będziemy analizować wartość funkcji będącej sumą


f (x) = g (x) + h(x),
gdzie:
x - aktualnie analizowany wierzchołek,
f (x) - droga pomiędzy wierzchołkiem początkowym a x (określona
dokładnie),
h(x) - przewidywana przez heurystykę droga od x do wierzchołka
docelowego.
Grafy
Algorytmy
Odległości Notes

A*, Oszacowanie odległości

h(∆φ, ∆Θ) = 1.8 ∗ 60 ∗ (0.25 ∗ ∆φ2 + ∆Θ2 )0.5

węzeł szerokość długość (φ) oszacowanie


(Θ) heurystyczne
Z 53.426 14.561 0
O 50.660 17.939 350
S 50.257 19.019 418
D 51.111 17.053 284
F 51.932 15.511 169
P 52.409 16.934 169
E 51.777 19.455 319

Grafy
Algorytmy
Odległości Notes

A*, Przebieg

{O}
D P S E
g+h 366 372 514 487
g 82 203 96 168
h 284 169 418 319

{ O, D }
P F S E
g+h 372 390 514 487
g 203 221 96 168
h 169 169 418 319

Grafy
Algorytmy
Odległości Notes

A*, Przebieg

{ O, D, P }
Z(P) F S E
g+h 395 390 514 487
g 395 221 96 168
h 0 169 418 319

{ O, D, P, F }
Z(P) Z(F) S E
g+h 395 396 514 487
g 395 396 96 168
h 0 0 418 319

Grafy
Algorytmy
Odległości Notes

A*, podsumowanie

Na co trzeba zwrócić uwagę:

I warunkiem stopu jest znalezienie się węzła docelowego na szczycie


kolejki priorytetowej

I warunkiem poprawności algorytmu jest dopuszczalność rozwiązań,


funkcja heurystycznej oceny pozostałej odległości musi spełniać dwa
warunki
I funkcja musi być urealniona, niepomnożenie w naszym
przykładzie odległości przez umowny przelicznik dawałoby
fałszywe sygnały
I wartości funkcji muszą byc mniejsze, niż realne wartości
Grafy
Algorytmy
Odległości Notes

Zagadka. Co to za miasto?

Grafy
Algorytmy
Cykle Notes

Zagadnienie Eulera

Zagadnienie mostów królewieckich

Brzegi Pregoły i dwie wyspy na niej połączone


są przy pomocy siedmiu mostów. Czy można
przejść przez wszystkie mosty tak, aby po
każdym przejść tylko raz?

I Cykl Eulera - cykl zawierający każdą krawędź dokładnie raz.


I Łańcuch Eulera - ścieżka zawierająca każdą krawędź dokładnie
raz

Grafy
Algorytmy
Cykle Notes

Zagadnienie Eulera

Warunki istnienia cyklu Eulera


I Graf musi być spójny

I W grafie nieskierowanym liczba krawędzi incydentnych do


każdego wierzchołka musi być parzysta
I W grafie skierowanym liczba krawędzi wchodzących musi być
równa liczbie gałęzi wychodzących (i oczywiście parzysta)

Grafy
Algorytmy
Cykle Notes

Zagadnienie Eulera

Rozważmy graf

Rozpoczniemy analizę od wierzchołka A

W ramach algorytmu znajdowania cyklu Eulera należy


I Dopóki istnieje możliwość osiągnięcia innych wierzchołków
dodawać je na stos, usuwając krawędzie między nimi
I Jeśli takiej możliwości nie ma przekładać wierzchołki ze stosu
do cyklu tak długo, aż się pojawi
Grafy
Algorytmy
Cykle Notes

Zagadnienie Eulera

Stos:
A

Cykl:
-

Stos:
A,B

Cykl:
-

Grafy
Algorytmy
Cykle Notes

Zagadnienie Eulera

Stos:
A,B,C

Cykl:
-

Stos:
A,B,C,A

Cykl:
-

Grafy
Algorytmy
Cykle Notes

Zagadnienie Eulera

Stos:
A,B

Cykl:
A,C

Stos:
A,B,D

Cykl:
A,C

Grafy
Algorytmy
Cykle Notes

Zagadnienie Eulera

Stos:
A,B,D,E

Cykl:
A,C

Stos:
A,B,D,E,B

Cykl:
A,C
Grafy
Algorytmy
Cykle Notes

Zagadnienie Eulera

Ostatecznie

Stos:
-

Cykl:
A,C,B,E,D,B,A

Grafy
Algorytmy
Cykle Notes

Cykl Hamiltona

Cykl Hamiltona - cykl zawierający każdy wierzchołek dokładnie


jeden raz.

Ścieżka (łańcuch) Hamiltona - ścieżka zawierająca każdy


wierzchołek dokładnie jeden raz

Istnieje wiele kryteriów określających warunek dostateczny tego,


aby graf był hamiltonowskim (Ore’go, Dirac’a, Chvatal’a, ilości
krawędzi).

Grafy
Algorytmy
Cykle Notes

Cykl Hamiltona, zagadnienie komiwojażera

Komiwojażer musi odwiedzić n miast, każde jeden raz i wrócić do


domu, z którego wyjechał, przebywając przy tym najkrótszą z
możliwych dróg.

Problem ten oznacza konieczność znalezienia w grafie


reprezentującym położenia i odległości miast cyklu Hamiltona
charakteryzującego się najkrótszą sumą wag.

Problem ma złożoność obliczeniową O(n!). Jest chyba


najsłynniejszym problemem NP trudnym.

Notes
Algorytmy geometryczne

Notes

Podstawy geometrii obliczeniowej

Tomasz M. Gwizdaªªa

Algorytmy geometryczne

Podstawy

Wspóªliniowo±¢, lewo, prawo Notes

Wspóªliniowo±¢ punktów

yC −yA yB −yA
xC −xA
= xB −xA

xA (yB −yC )+xB (yC −yA )+xC (yA −yB ) = 0


xA
yA 1
det(A, B, C ) = xB yB 1 = 0


xC yC 1

Algorytmy geometryczne

Podstawy

Wspóªliniowo±¢, lewo, prawo Notes

Lewo i prawo

Narysujmy odcinek pomi¦dzy punktami


A(1, 1) i B(4, 4)

oraz punkty
C (5, 1) i D(1, 5)

Jak mo»na okre±li¢ poªo»enie punktów


C iD
wzgl¦dem odcinka AB ?

Algorytmy geometryczne

Podstawy

Wspóªliniowo±¢, lewo, prawo Notes

Lewo i prawo


1 1 1 4 4 1

det(A, B, C ) = 4 4 1 = −12 det(B, A, C ) = 1 1 1 = 12


5 1 1 5 1 1


1 1 1 4 4 1

det(A, B, D) = 4 4 1 = 12 det(B, A, D) = 1 1 1 = −12


1 5 1 1 5 1

Je±li det(A, B, C ) < 0 to punkt C jest z prawej strony odcinka AB


Je±li det(A, B, C ) > 0 to punkt C jest z lewej strony odcinka AB
Odcinka, czy póªprostej lub wektora?
Algorytmy geometryczne

Podstawy

Wspóªliniowo±¢, lewo, prawo Notes

Wspóªliniowo±¢ punktów

Jak jednoznacznie okre±li¢, czy punkt C


nale»y do odcinka AB ?

Aby punkt C nale»aª do odcinka AB potrzeba i wystarcza, aby punkty te byªy


wspóªliniowe, oraz

min(xA , xB ) ¬ xC ¬ max(xA , xB ) ∧ min(yA , yB ) ¬ yC ¬ max(yA , yB )

Algorytmy geometryczne

Podstawy

Przecinanie Notes

Przecinanie si¦ odcinków

Jak wida¢ odcinek AB jest przecinany


przez odcinki:
K1 L1
K2 L2
K3 L3

Jak zapisa¢ reguª¦ przecinania?

Algorytmy geometryczne

Podstawy

Przecinanie Notes

Przecinanie si¦ odcinków


det(A, B, L1 ) < 0, det(A, B, K1 ) > 0
det(K1 , L1 , A) < 0, det(K1 , L1 , B) > 0

det(A, B, L2 ) < 0, det(A, B, K2 ) > 0


det(K2 , L2 , A) = 0, det(K2 , L2 , B) > 0

det(A, B, L3 ) = 0, det(A, B, K3 ) > 0


det(K3 , L3 , A) < 0, det(K3 , L3 , B) = 0

det(A, B, L4 ) < 0, det(A, B, K4 ) < 0


det(K4 , L4 , A) < 0, det(K4 , L4 , B) > 0

Algorytmy geometryczne

Podstawy

Przecinanie Notes

Przecinanie si¦ odcinków

Warunek przecinania si¦ odcinków mo»na sformuªowa¢ nast¦puj¡co:

Aby dwa odcinki si¦ przecinaªy nie mo»e mie¢ miejsca taka sytuacja,
»e oba kra«ce jednego z odcinków s¡ po tej samej stronie drugiego.

Oba wyznaczniki nie mog¡ mie¢ tego samego znaku.


Algorytmy geometryczne

Podstawy

Zawieranie Notes

Przynale»no±¢ do gury

Jak sprawdzi¢, »e:

punkt D le»y wewn¡trz gury,

punkt C le»y na zewn¡trz gury?

Algorytmy geometryczne

Podstawy

Zawieranie Notes

Przynale»no±¢ do gury

Najprostsz¡ metod¡ jest:

1. przeprowadzi¢ póªprost¡ od danego


punktu do dowolnego punktu le»¡cego na
pewno poza gur¡

2. policzy¢ punkty przeci¦cia, z odcinkami


b¦d¡cymi bokami gury

Nieparzysta ilo±¢ przeci¦¢ sygnalizuje, »e punkt jest wewn¡trz gury.

Parzysta ilo±¢ przeci¦¢ sygnalizuje, »e punkt jest na zewn¡trz gury

Algorytmy geometryczne

Przecinanie i zamiatanie

Notes

Przeci¦cia w zbiorze punktów

Jak znale¹¢ wszystkie punkty przeci¦¢ odcinków nale»¡cych do


pewnego zbioru?

Metoda zachªanna zakªada sprawdzenie wszystkich mo»liwych


par odcinków. Jej zªo»ono±¢ obliczeniowa jest oczywi±cie
O(n2 ).

Algorytmem szybszym jest tzw. algorytm zamiatania.

Algorytmy geometryczne

Przecinanie i zamiatanie

Algorytm zamiatania Notes

Poj¦cia

Miotª¡ jest prosta równolegªa do osi OY poruszaj¡ca si¦ w


kierunku wzrastaj¡cych warto±ci x.

Dla danego poªo»enia miotªy wyró»niamy trzy rodzaje


odcinków:

▶ przetworzone (oba ko«ce na lewo od miotªy)

▶ aktywne (aktualnie przecinaj¡ce miotª¦)

▶ oczekuj¡ce (oba ko«ce na prawo od miotªy)


Algorytmy geometryczne

Przecinanie i zamiatanie

Algorytm zamiatania Notes

Struktury
Wykorzystujemy dwie struktury danych:

▶ X, Harmonogram zdarze«
posortowany wzgl¦dem wspóªrz¦dnej x zbiór punktów
ko«cowych odcinków oraz punktów przeci¦¢ odcinków
aktywnych, które byªy s¡siadami w strukturze Y

▶ Y, Struktura stanu
zbiór zawieraj¡cy nazwy odcinków aktywnych
uporz¡dkowanych wzgl¦dem wspóªrz¦dnej y punktu
przeci¦cia z miotª¡, cz¦sto zbalansowane BST

Algorytmy geometryczne

Przecinanie i zamiatanie

Algorytm zamiatania Notes

Przebieg
▶ W strukturze X umie±¢ uporz¡dkowane ko«ce wszystkich
odcinków

▶ Wybierz i usu« z X element minimalny. Je±li jest on:


▶ pocz¡tkiem odcinka - dodajemy nazw¦ do Y;
sprawdzamy przeci¦cia z s¡siadami w Y; je±li takie
istniej¡ umieszczamy wspóªrz¦dne przeci¦¢ w X
▶ ko«cem odcinka - usuwamy nazw¦ z Y
▶ punktem przeci¦cia odcinków - zamieniamy poªo»enia
odcinków w Y; sprawdzamy przeci¦cia na prawo od
miotªy z nowymi s¡siadami; je±li takie istniej¡
umieszczamy wspóªrz¦dne przeci¦¢ w X
▶ Te operacje powtarzamy a» do opró»nienia X

Algorytmy geometryczne

Przecinanie i zamiatanie

Algorytm zamiatania Notes

Przykªad

Rozwa»my zbiór skªadaj¡cy si¦ z odcinków:

A[(1, 1), (2, 4)]

B[(1, 3), (4, 0)]

C [(1.5, 2), (3, 2)]

Punkty przeci¦cia

A z B (1.5, 2.5)
B z C (2, 2)

Algorytmy geometryczne

Przecinanie i zamiatanie

Algorytm zamiatania Notes

Przykªad (1)

X: X: 1B,b , 1.5C ,b , 2A,e , 3C ,e , 4B,e



1A,b , 1B,b , 1.5C ,b , 2A,e , 3C ,e , 4B,e


Y: Y: A(1)
Algorytmy geometryczne

Przecinanie i zamiatanie

Algorytm zamiatania Notes

Przykªad (2)

X: 1.5C ,b , 2A,e , 3C ,e , 4B,e




Y: A(1), B(3) X: 1.5C ,b , 2A,e , 3C ,e , 4B,e




X: 1.5AB , 1.5C ,b , 2A,e , 3C ,e , 4B,e Y: B(2.5), A(2.5)




Algorytmy geometryczne

Przecinanie i zamiatanie

Algorytm zamiatania Notes

Przykªad (3)

X: 2A,e , 3C ,e , 4B,e


Y: C (2), B(2.5), A(2.5) X: 2BC , 3C ,e , 4B,e




X: 2A,e , 2BC , 3C ,e , 4B,e Y: C (2), B(2.5)




Algorytmy geometryczne

Przecinanie i zamiatanie

Algorytm zamiatania Notes

Przykªad (4)

X: 4B,e

X: 3C ,e , 4B,e

Y: B(2)
Y: B(2), C (2) itd.

Algorytmy geometryczne

Wypukªa otoczka

Sortowanie wg. k¡ta promienia wodz¡cego Notes

Cel
Procedura sortowania ze wzgl¦du na k¡t promienia wodz¡cego
poprowadzonego do danego punktu jest procedur¡
pomocnicz¡, wykorzystywan¡ w innych zagadnieniach.
Algorytmy geometryczne

Wypukªa otoczka

Sortowanie wg. k¡ta promienia wodz¡cego Notes

Algorytm

Mo»emy wykorzysta¢ funkcje trygonometryczne lub unikn¡¢ liczenia sum szeregów


deniuj¡c funkcj¦ wedªug schematu

 yi

 di
, xi ­ 0 ∧ yi ­ 0


2 − yi , xi < 0 ∧ yi >

0


 di
α= |yi |


2+
di
, xi ¬ 0 ∧ yi ¬ 0



 |yi |

4 − di
, xi > 0 ∧ yi < 0

Algorytmy geometryczne

Wypukªa otoczka

Algorytm Grahama Notes

Wypukªa otoczka
Wypukªa otoczk¡ (convex hull) pewnego zbioru punktów nazywamy najmniejszy
wielok¡t wypukªy, taki, »e wszystkie punkty nale»¡ce do zbioru, nale»¡ do tego
wielok¡ta.
Uwaga! Brzeg te» nale»y do wielok¡ta.

Wypukª¡ otoczk¦ zadanego zbioru tworz¡ punkty:


A, F, C, B, D, G

Algorytmy geometryczne

Wypukªa otoczka

Algorytm Grahama Notes

Algorytm
Algorytm znajdowania wypukªej otoczki nosi nazw¦ algorytmu
Grahama.
▶ Wybieramy punkt, który na pewno b¦dzie nale»aª do wypukªej
otoczki.
Najcz¦±ciej jest to punkt o najmniejszej lub najwi¦kszej
warto±ci wybranej wspóªrz¦dnej.
Je±li takich punktów jest wi¦cej bierzemy pod uwag¦ drug¡
wspóªrz¦dn¡

▶ Sortujemy wzgl¦dem k¡tów promieni wodz¡cych


wyprowadzonych z tego punktu.

▶ Punkt wybrany, jako pocz¡tkowy oraz dwa pierwsze na


posortowanej li±cie zapisujemy do struktury przechowuj¡cej
dane o otoczce.

Algorytmy geometryczne

Wypukªa otoczka

Algorytm Grahama Notes

Punkt pocz¡tkowy
Punkt A na pewno b¦dzie nale»aª do wypukªej otoczki.

Kolejno±¢ punktów posortowanych, to: F,H,C,E,B,D,G.


Algorytmy geometryczne

Wypukªa otoczka

Algorytm Grahama Notes

Kolejne dwa punkty


WO: A, F, H

Wiemy te», »e do wypukªej otoczki b¦dzie nale»aª punkt F.

Algorytmy geometryczne

Wypukªa otoczka

Algorytm Grahama Notes

Powtarzamy
Podstaw¡ algorytmu jest sprawdzenie, czy kolejny punkt znajduje si¦ po prawej, czy po
lewej stronie odcinka ª¡cz¡cego dwa ostatnie punktu w strukturze WO. Wyró»niamy
dwie mo»liwo±ci:
▶ Punkt znajduje si¦ po lewej stronie odcinka lub jest z nim wspóªliniowy - kolejny
punkt dodajemy do struktury WO
▶ Punkt znajduje si¦ po prawej stronie odcinka - kolejny punkt zast¦puje ostatni
w strukturze WO (trzeba wtedy wykona¢ sprawdzenie tak»e dla poprzednich par
punktów na li±cie, ewentualnie usuwaj¡c wcze±niejsze punkty z WO)

WO: A, F, C

Algorytmy geometryczne

Wypukªa otoczka

Algorytm Grahama Notes

WO: A, F, C, E

Ten algorytm powtarzamy dla ka»dego punktu na posortowanej li±cie.

Algorytmy geometryczne

Wypukªa otoczka

Algorytm Grahama Notes

WO: A, F, C, E
Algorytmy geometryczne

Wypukªa otoczka

Algorytm Grahama Notes

WO: A, F, C, B

Algorytmy geometryczne

Wypukªa otoczka

Algorytm Grahama Notes

WO: A, F, C, B, D

Algorytmy geometryczne

Wypukªa otoczka

Algorytm Grahama Notes

WO: A, F, C, B, D, G

Punkt G jest ostatnim analizowanym punktem.

Algorytmy geometryczne

Drzewo BSP

Kolejno±¢ renderowania obiektów Notes

Poj¦cie

BSP  Binary Space Partition, Binarny Podziaª Przestrzeni

Drzewo BSP jest struktur¡ umo»liwiaj¡c¡ okre±lenie kolejno±ci


rysowania obiektów tak, aby obiekt znajduj¡cy si¦ dalej nie
przekrywaª obiektów bli»szych.

Innymi popularnymi metodami takiego porz¡dkowania s¡


metody typu:

depth sort
z-sort
Algorytmy geometryczne

Drzewo BSP

Drzewo BSP Notes

Cel
Naszym celem b¦dzie uporz¡dkowanie w odpowiedniej
kolejno±ci obiektów A-G, z punktu widzenia obserwatora O.
Warto zwróci¢ uwag¦, »e obiekty nie s¡ punktowe.

Algorytmy geometryczne

Drzewo BSP

Drzewo BSP Notes

Obserwacja
Poprowad¹my kilka przykªadowych prostych dziel¡cych przestrze«
zawieraj¡c¡ obiekty na podprzestrzenie. Strzaªka oznacza t¦
podprzestrze«, w której znajduje si¦ obserwator.

Zwró¢my uwag¦, »e nigdy nie wyst¡pi taka sytuacja, »e obiekt znajduj¡cy


si¦ w podprzestrzeni, w której nie ma obserwatora zasªoni obiekt z
podprzestrzeni, w której obserwator jest.

Algorytmy geometryczne

Drzewo BSP

Drzewo BSP Notes

Dalsze podziaªy
Wybierzmy jeden z przedstawionych podziaªów i dokonujmy
dalszych podziaªów podprzestrzeni, zawsze na dwie. Oznaczajmy
póªproste symbolami k[n]. Zaznaczajmy te» t¦ podprzestrze«, w
której znajduje si¦ obserwator.

Algorytmy geometryczne

Drzewo BSP

Drzewo BSP Notes

Ostateczny ksztaªt drzewa


W oparciu o dokonany podziaª zbudujmy drzewo binarne wedªug
nast¦puj¡cego schematu:
▶ w w¦zªach drzewa znajduj¡ si¦ prosta i póªproste, przy czym relacja
jest taka, »e potomkami s¡ te póªproste, których pocz¡tek le»y na
rodzicu.
▶ obiekty znajduj¡ si¦ w li±ciach.
▶ lewym potomkiem jest zawsze ten w¦zeª/li±¢, który znajduje si¦ z
tej samej strony póªprostej, co obserwator (kwestia konwencji).
Algorytmy geometryczne

Drzewo BSP

Drzewo BSP Notes

Rysowanie
Kolejno±¢ rysowania musi by¢ taka, aby obiekty dalsze byªy
rysowane wcze±niej, czyli wybieramy zawsze najpierw prawe
poddrzewa i obiekty.

Zatem kolejno±¢ rysowania jest nast¦puj¡ca:

D, A, B, G, C, E, F

Algorytmy geometryczne

Drzewo BSP

Drzewo BSP Notes

Problemy

1. Obiekty o du»ych rozmiarach, które trzeba dzieli¢

2. Zmiana poªo»enia obserwatora

Algorytmy geometryczne

Drzewo BSP

Drzewo BSP Notes

Problemy
Zaªó»my, »e obserwator zmieniª
poªo»enie.

Przeanalizujmy drzewo BSP


zapisuj¡c w k6 ka»dym w¦¹le, czy
obserwator jest w podprzestrzeni
wskazywanej przez strzaªk¦ (p), czy
w drugiej (z).

Post¦pujmy teraz analogicznie, jak


w poprzedniej sytuacji, czyli
najpierw wybieramy to, co jest w
dopeªniaj¡cej podprzestrzeni

A B D F E C G

Notes
Notes

Wyszukiwanie wzorca
String matching

Tomasz M. Gwizdałła

Podstawowe definicje Notes

Zdefiniujmy dwa pojęcia

tekst T [0..n − 1] (text) |T | = n


wzorzec P[0..m − 1] (pattern) |P| = m

Elementy tablicy brane są z pewnego zbioru Σ zwanego alfabetem


Mówimy, że wzorzec występuje na pozycji s (z przesunięciem s),
jeżeli

T [s..s + m − 1] = P[0..m − 1]
T [s] = P[0], .., T [s + m − 1] = P[m − 1]

Mówimy też, że przesunięcie s jest przesunięciem poprawnym

Określenie problemu Notes

Zagadnienie wyszukiwania wzorca polega na

znalezieniu
wszystkich poprawnych przesunięć
wzorca w tekście

Inne pojęcia Notes

Niech Σ∗ będzie zbiorem wszystkich łańcuchów o skończonej


długości, które mogą być utworzone z alfabetu Σ

w jest prefixem łańcucha (tekstu) x, jeśli

w [x ⇐⇒ ∃y ∈Σ∗ x = wy

w jest suffixem łańcucha (tekstu) x, jeśli

w ]x ⇐⇒ ∃y ∈Σ∗ x = yw
Algorytm naiwny Notes

W algorytmie naiwnym sprawdzamy znak po znaku, przesuwając


wzorzec względem tekstu zawsze o 1

K ATARAKTA KAT ARAK TA


A RAK ARAK
KA T ARAKTA KATA R AKTA
A R AK A RAK

KA T ARAKTA KATARA K TA
A RAK A R AK

Algorytm naiwny Notes

• Złożoność obliczeniowa
O(m ∗ n)

• Algorytm charakteryzuje się dużą wrażliwością, zależną od


rozmiaru alfabetu

Algorytm naiwny Notes

a 8.91 z 5.64 1.82


ł
i 8.21 n 5.52 b 1.47
o 7.75 r 4.69 g 1.42
e 7.66 w 4.65 h 1.08
y 3.76 s 4.32 ż 0.83
u 2.5 t 3.98 ś 0.66
ę 1.11 c 3.96 ć 0.4
ą 0.99 k 3.51 f 0.3
ó 0.85 d 3.25 ń 0.2
prawdopodobieństwo p 3.13 q 0.14
przypadkowego m 2.8 ź 0.06
wyboru 2 takich j 2.28 v 0.04
samych znaków: l 2.1 x 0.02
≈ 0.05

Zagadnienie Notes

Ideą algorytmu Karpa-Rabina jest przetransformowanie łańcucha


znakowego do postaci liczbowej, po czym dokonywanie porównań
na liczbach całkowitych.
Założenia Notes

Załóżmy, że alfabet składa się tylko z czterech znaków

Σ = {A, K , R, T }

Przypiszmy każdemu znakowi jego indeks w takim alfabecie


(zaczynając od jedynki) i przepiszmy zarówno tekst, jak i wzorzec
używając znaków tych indeksów lub przejdźmy od razu do zapisu
poniżej

KATARAKTA = ”214131241”
ARAK = ”1312”

Algorytm Notes

Przedstawmy te łańcuchy znakowe, jako liczby w układzie


dziesiętnym

ts = m
i=1 T [i + s] ∗ 10
m−i
P
t0 = 2141
p= mi=1 P[i] ∗ 10
m−i
P
p = 1312

Jak łatwo zauważyć warunkiem poprawności przesunięcia s jest


równość:

ts = p

Algorytm Notes

Problemem, który trzeba rozwiązać jest duża ilość mnożeń w fazie


obliczania obu wartości. Można ją oszacować
m(m+1)
Nm = 2

Można ją zmniejszyć do ilości liniowej w zmiennej m poprzez

p = P[m] + 10 ∗ (P[m − 1] + 10 ∗ (...))

Algorytm Notes

Trzeba też zmodyfikować sposób wyznaczania ts . Można np.


wyznaczać je rekurencyjnie, weźmy t0 i t1

t0 = 2141 t1 = 1413
1413 = (2141 − 2000) ∗ 10 + 3

t1 = (t0 − T [0] ∗ 10m−1 ) ∗ 10 + T [4]

ts+1 = (ts − T [s] ∗ 10m−1 ) ∗ 10 + T [s + m]

Złożoność obliczeniowa operacji wyznaczania ts jest teraz stała


O(1)
Problemy Notes

• Rozmiar alfabetu
• Zakres liczby całkowitej

Załóżmy teraz, że znaki z przykładu są wybrane z całego alfabetu


łacińskiego, liczącego 26 znaków
Zarówno liczbę p, jak i ts trzeba zapisać w układzie o podstawie
równej rozmiarowi alfabetu. Oznaczmy tę wielkość przez d

ts+1 = (ts − T [s + 1] ∗ d m−1 ) ∗ d + T [s + m + 1]

Problemy Notes

Aby rozwiązać problem zakresu liczby całkowitej trzeba

• Rozszerzyć jej zakres poprzez stworzenie własnej


implementacji
• Posłużyć się działaniami modulo

(a ∗ b) mod c = ((a mod c) ∗ (b mod c)) mod c

Problemy Notes

Jaką liczbę przyjąć, jako argument dzielenia modulo?


Zwyczajowo przyjmuje się takie q, że d ∗ q < rozmiar słowa

ts+1 = ((ts − (T [s + 1] ∗ d m−1 ) mod q) ∗ d) mod q + T [s + m + 1]

h = d m−1 mod q

ts+1 = ((ts − (T [s + 1] ∗ h) mod q) ∗ d) mod q + T [s + m + 1]

Podsumowanie Notes

• Równość p = ts nie jest w tym przypadku jednoznaczną


odpowiedzią na pytanie o prawidłowe przesunięcie. Wymagane
jest jeszcze sprawdzenie znaków

• Złożoność obliczeniowa
O(n)
Założenia Notes

Zmieńmy łańcuchy znakowe. Niech nasz alfabet składa się z liter:


A, C, G, T.

Szukajmy wzroca TATA w tekście TTATCTATAGCT.

Spróbujmy przesuwać wzorzec względem tekstu o większą liczbę


znaków, niż w przeszukiwaniu naiwnym

Przesuwanie (1) Notes

O ile możemy przesunąć wzorzec w takiej sytuacji.

T T 1 znak
T A

A teraz?
TTAT C 2 znaki
TAT A

Teraz znów podobna sytuacja?

TTAT C 1 znak
T A

Przesuwanie (2) Notes

TTAT C 1 znak
T

Sukces, ale o ile można przesunąć teraz?

TTATC TATA 2 znaki


TATA

TTATCTATA G 2 znaki
TA T

Przesuwanie - podsumowanie Notes

gdzie ile znaków “z


przodu” i “z
wystąpił tyłu” jest takich przesunięcie C1 - C2 -1
błąd samych

2 1 1 0
4 1 2 2
2 1 1 0
1 0 1 0
5 2 2 2
3 0 2 2
Kryterium przesuwania Notes

To co określić dla wzorca, to:


• analizować po kolei wszystkie jego prefiksy
• dla tych prefiksów wyznaczać długości prefiksów, które są
równocześnie sufiksami
0 0
1 T 1
2 TA 0
3 TAT 1
4 TATA 2

Tworzymy tablicę preprocesingu Π = [0, 1, 0, 1, 2].

Kryterium przesuwania Notes

Ostatecznie, przesunięcie następuje o:

max(1, j − Π[j] − 1)

Analiza złożoności obliczeniowej algorytmu BM wymaga podania


jej dla dwóch faz osobno
• preprocessing O(m)
• przeszukiwanie O(n)

Założenia Notes

Zmieniamy sposób porównywania znaków, zaczynamy teraz


porównania od końca łańcucha wzorca
KAT A RAKTA
ARA K
O ile możemy przesunąć wzorzec względem tekstu; pokrywać się
mogą litery A, zatem przesuwamy o 1
KATA R AKTA
ARA K
Teraz pokryć się mogą litery R
KAT ARAK TA
ARAK

Założenia Notes

Ale można też inaczej


OPANC E RZONY
G RZ E G O RZ

Możemy przesunąć o 2 znaki, tak aby podpisać


OPANC E R Z ONY
GR Z E GO R Z

Możemy przesunąć o 2 znaki, tak aby podpisać


OPANC E RZ ON Y
G RZ E GORZ
BCS Notes

Mamy dwa rodzaje porównań i dwa preprocessingi

Bad character shift (occurence shift)

Przesunięcie następuje do takiej pozycji, żeby pozycji tekstu, gdzie


nastąpiła niezgodność odpowiadał zgodny z nią znak wzorca

Tablica pre BC ma rozmiar alfabetu


A R A K

[A] [K] [R] [T]


[1] [4] [2] [4]

GSS Notes

Good suffix shift (matching shift)

Przesunięcie następuje do takiej pozycji, żeby pokrył się pasujący


suffix wzorca, jednak poprzedzony innym znakiem, niż ten, na
którym wystąpiła niezgodność. Szukamy oczywiście wystąpienia
tego suffixu jak najbardziej z prawej strony wzorca

Tablica pre GS ma rozmiar równy długości wzorca


A R A K

[4] [4] [4] [1]

Założenia Notes

K AT A RAKT A
A R A K
pre BC [A] = 1, pre GS[4] = 1, przesunięcie=1

KA T A R AKT A
A R A K
pre BC [R] = 2, pre GS[4] = 1, przesunięcie=2

KA T A RAK T A
A RAK
A co z przesunięciem? Zawsze pre GS[0].

Podsumowanie Notes

Mając dwie możliwe wartości przesunięć, w algorytmie


Boyera-Moore’a wybieramy zawsze tę większą)

Analiza złożoności obliczeniowej algorytmu BM wymaga podania


jej dla dwóch faz osobno
• preprocessing O(m + σ)
• przeszukiwanie O(n)
Wybrane algorytmy arytmetyczne

Notes

Wybrane algorytmy arytmetyczne

Tomasz M. Gwizdałła

Wybrane algorytmy arytmetyczne


Odwrotna Notacja Polska
Działania arytmetyczne Notes

Drzewo działań
Rozważmy działanie:

(a + b − c) ∗ (d + e ∗ f )/(g + h)

Utwórzmy drzewo binarne według reguły, mówiącej, że rodzic


zawiera operator, którego operandami są jego potomkowie

Wybrane algorytmy arytmetyczne


Odwrotna Notacja Polska
Działania arytmetyczne Notes

Drzewo działań
Ostatecznie drzewo przyjmuje postać:

Wykonajmy dla niego przejścia poznanymi wcześniej metodami.

Wybrane algorytmy arytmetyczne


Odwrotna Notacja Polska
Działania arytmetyczne Notes

Drzewo działań: in-order

Kolejność: a+b-c*d+e*f/g+h
Wybrane algorytmy arytmetyczne
Odwrotna Notacja Polska
Działania arytmetyczne Notes

Drzewo działań: pre-order

Kolejność: *-+abc/+d*ef+gh

Wybrane algorytmy arytmetyczne


Odwrotna Notacja Polska
Działania arytmetyczne Notes

Drzewo działań: post-order

Kolejność: ab+c-def*+gh+/*

Wybrane algorytmy arytmetyczne


Odwrotna Notacja Polska
Działania arytmetyczne Notes

Drzewo działań: podsumowanie

In-order: a+b-c*d+e*f/g+h
Po pogrupowaniu: ((a+b)-c)*(d+e*f)/(g+h)
Typowa notacja infiksowa.

Pre-order: *-+abc/+d*ef+gh
Notacja Polska (Jan Łukasiewicz, 1920).

Kolejność: ab+c-def*+gh+*
Odwrotna Notacja Polska
Reverse Polish Notation (Burks, Warren, Wright, 1954)

Wybrane algorytmy arytmetyczne


Odwrotna Notacja Polska
Algorytm konwersji Notes

Realizacja działania

Operator występuje po operandach:

a+b -> ab+, a/b -> ab/, aˆb -> abˆ

Notacja jest postfiksowa i nienawiasowa

Stosując ONP możemy posługujemy się dwoma strukturami:


wejściem i stosem.
Możemy napotkać tylko jeden z dwóch typów znaków:
I operand - przenosimy go na stos
I operator - powoduje pobranie dwóch ostatnich operandów ze
stosu, wykonanie operacji i położenie wyniku na stos
Ostatecznie wynik działania znajduje się na stosie.
Wybrane algorytmy arytmetyczne
Odwrotna Notacja Polska
Algorytm konwersji Notes

Struktury danych

Posługujemy się dwoma strukturami danych:


I wyjściem, na które zapisujemy gotowy łańcuch znaków w RPN
I stosem, strukturą tymczasową, na którą zapisujemy znaki,
które w danym momencie nie mogą zostać zapisane do
łańcucha wyjściowego

Ostatecznie wynik konwersji znajduje się w łańcuchu wyjściowym.

Wybrane algorytmy arytmetyczne


Odwrotna Notacja Polska
Algorytm konwersji Notes

Algorytm

Na wejściu może pojawić się jeden z czterech typów znaków


I operand - wypisujemy ją na wyjściu
I nawias otwierający - kładziemy go na stosie
I operator - zdejmujemy ze stosu i wypisujemy na wyjściu
wszystkie operatory priorytecie niemniejszym niż ten wczytany.
Następnie kładziemy wczytany operator na stosie.
I nawias zamykający - zdejmujemy ze stosu i wypisujemy na
wyjściu wszystkie działania aż do napotkania nawiasu
otwierającego, którego nie wypisujemy

Kiedy łańcuch wejściowy jest pusty przepisujemy ze stosu wszystkie


pozostałę tam znaki.

Wybrane algorytmy arytmetyczne


Odwrotna Notacja Polska
Algorytm konwersji Notes

Przykład
(a+b)*(c+d)

znak wyjście stos


( (
a a (
+ a (+
b ab (+
) ab+
* ab+ *
( ab+ *(
c ab+c *(
+ ab+c *(+
d ab+cd *(+
) ab+cd+ *
ab+cd+*

Wybrane algorytmy arytmetyczne


Potęgowanie modularne
Notes

Arytmetyka modularna
Celem jest wyznaczenie wartości wyrażenia:

x n mod p

Zacznijmy od prostej obserwacji:

a ∗ b mod p = (a mod p) ∗ (b mod p) mod p


a ∗ b =p (a mod p) ∗ (b mod p)
a = k ∗ p + r1 , b = l ∗ p + r2

P = r1 ∗ r2 mod p
L = (kp + r1 )(lp + r2 ) mod p =
(klp 2 + kpr2 + lpr1 + r1 r2 ) mod p = r1 ∗ r2 mod p
Wybrane algorytmy arytmetyczne
Potęgowanie modularne
Notes

Arytmetyka modularna

x 2 mod p =p (x mod p) ∗ (x mod p)


x 4 mod p =p (x 2 mod p) ∗ (x 2 mod p)
x 8 mod p =p (x 4 mod p) ∗ (x 4 mod p)
. . .
x 2k mod p =p (x k mod p) ∗ (x k mod p)

Qk−1 b 2i Qk−1 b 2i
x n mod p = i=0 x
i mod p =p i=0 (x i mod p),

gdzie b = {bk , ..., b1 , b0 } jest binarnym zapisem wykładnika n.

Wybrane algorytmy arytmetyczne


Potęgowanie modularne
Notes

Algorytm potęgowania

I przedstawiamy wykładnik potęgi w postaci liczby binarnej


i
I wynaczamy wartości x 2 mod p wykorzystując wartości
policzone dla niższych potęg
I jeśli na zadanej pozycji w zapisie binarnym występuje 1
uwzględnij resztę z dzielenia modulo w całkowitym iloczynie

Wybrane algorytmy arytmetyczne


Potęgowanie modularne
Notes

Algorytm potęgowania - przykład

Załóżmy, że x = 7, n = 11, p = 23.


711 mod 23 = 1 977 326 743 mod 23 = 22

1110 = 10112

pi = reszta ri =
i bi 2i 7m 7m mod 23 2
pi−1 %23 pi ∗ ri−1
1
0 1 1 7 7 7 7
1 1 2 49 3 3 21
2 0 4 9 21
3 1 8 5764801 12 12 22

Notes

You might also like