Metody algorytmiczne

Transkrypt

Metody algorytmiczne
Algorytmy i struktury danych
Metody
algorytmiczne
Bartman Jacek
[email protected]
Metody algorytmiczne - wprowadzenia
• Znamy strukturę algorytmów
• Trudność tkwi natomiast w podaniu metod służących
„wymyślaniu” algorytmów. Nie istnieją algorytmy
służące do tworzenia algorytmów
• Istnieją jednak ogólne metody algorytmiczne, które
mogą być przydatne w rozwiązywaniu zadań, gdyż
pewne algorytmy bezpośrednio z nich wynikają.
• W wielu zadaniach algorytmicznych powstaje
potrzeba obejścia elementów pewnej struktury, np. w
celu znalezienia największego elementu ze zbioru
danych przechowywanych w tej strukturze.
• Każdemu rodzajowi struktury danych odpowiadają
różne sposoby obejścia:
– wektory, listy iteracja (pętla)
– tablice wielowymiarowe, listy list
– drzewa
rekurencja
iteracje zagnieżdżone
Przeszukiwanie drzewa w głąb
• Cechą charakterystyczną jest to, aby przeszukiwać jak
najbardziej na lewo.
• Strategia ta jest naturalna dla tych
problemów i grafów, w których ocena
właściwości węzłów zależy ściśle od oceny
właściwości ich rodziców.
Przykłady algorytmów przeszukiwania w głąb
PREORDER (prefiksowy) – korzeń drzewa umieszczony na
pierwszym miejscu listy wierzchołków, a dalej znajdują się
poddrzewa w kolejności swoich korzeni, np.:
R
S
V
W
U
X
Y
P
Q
Z
Lista wierzchołków w porządku prefiksowym:
RVUWXYZSPQ
POSTORDER (postfiksowy) - poddrzewa są umieszczone
najpierw i dopiero na końcu znajduje się korzeń (w tym
porządku wierzchołek umieszcza się na liście wtedy, gdy
jest odwiedzany po raz ostatni), np.:
R
S
V
W
U
X
Y
P
Q
Z
Lista wierzchołków w porządku postfiksowym:
UXYZWVPQSR
INORDER (infiksowy) – tylko dla drzew binarnych; korzeń V
znajduje się między wierzchołkami poddrzewa, którego
korzeniem jest lewe dziecko korzenia R, a wierzchołkami
poddrzewa, którego korzeniem jest prawe dziecko korzenia
R, np.:
R
U
W
X
S
Ł
V
Y
Z
Q
P
Lista wierzchołków w porządku infiksowym:
VWYXZRŁUPSQ
Przeszukiwanie drzewa wszerz
•
Przeszukiwanie wszerz jest strategią warstwową.
Rozpoczyna swoje działanie od korzenia
i wykonuje ekspansję najpłytszego węzła, ze
zbioru węzłów do tej pory nie rozszerzonych.
•
Jako pierwsze strategia w szerz wyznacza
rozwiązanie optymalne pod względem
długości ścieżki rozwiązania.
•
Poważna wada metody jest duże wymagania na pamięć – konieczne
jest pamiętanie wszystkich węzłów z przeszukiwanej głębokości.
Metoda „dziel i zwyciężaj”
• Metodę stosujemy wówczas gdy rozwiązanie całego
zadania jest trudne natomiast pozwala się ono podzielić
na zadania prostsze, których rozwiązania po scaleniu
daja rozwiązanie zadania pierwotnego
• W metodzie tej możemy wyróżnić następujące etapy:
– DZIEL: Dzielimy problem na podproblemy
– ZWYCIĘŻAJ: Rozwiązujemy podproblemy rekurencyjnie (czyli
stosując metodę „dziel i zwyciężaj”), chyba że są one małego
rozmiaru i do ich rozwiązania wystarczy użyć bezpośrednich
metod
– POŁĄCZ: Łączymy rozwiązania podproblemów, aby otrzymać
rozwiązanie całego problemu
Przykłady zastosowania metody dziel i zwyciężaj
Sortowanie przez scalanie
zasada działania
Początek
algorytmu
Po pierwszym
wywołaniu
Po drugim
wywołaniu
Po trzecim
wywołaniu
4 6 3 2 1 5 8 7
4 6 3 2
4 6
1 5 8 7
3 2
4 6 3
1 5
2 1
8 7
5 8
7
Przykłady zastosowania metody „dziel i zwyciężaj”
Sortowanie przez scalanie
Algorytmy zachłanne
• Algorytm zachłanny (ang. greedy algorithm) – algorytm,
który w celu wyznaczenia rozwiązania w każdym kroku
dokonuje zachłannego, tj. najlepiej rokującego w danym
momencie wyboru rozwiązania częściowego. Innymi
słowy algorytm zachłanny nie patrzy czy w kolejnych
krokach jest sens wykonywać dane działanie, dokonuje
decyzji lokalnie optymalnej, dokonuje on wyboru
wydającego się w danej chwili najlepszym, kontynuując
rozwiązanie podproblemu wynikającego z podjętej
decyzji.
• Algorytmy zachłanne nie zawsze prowadzą do
optymalnych rozwiązań, choć dla szerokiej gamy
problemów dają dobre rezultaty.
Przykład zastosowania metody zachłannej
• Minimalne drzewo rozpinające w grafie
Rozważmy sieć miast i przedsiębiorcę, któremu zapłacono za takie
ułożenie torów, aby z każdego miasta można było dotrzeć do każdego
innego. Ponieważ nasz przedsiębiorca jest bardzo leniwy, interesuje go
ułożenie najtańszej (czyli najkrótszej) kombinacji odcinków szyn.
Przyjmijmy, że możliwe są tylko takie połączenia miast, jak pokazano na
rysunku:
26
3
17
12
10
14
13
9
15
7
8
11
6
16
4
Algorytm konstrukcji rozpinających sieci kolejowych
•
•
Wybierz najkrótszy odcinek drogi;
Powtarzaj co następuje, aż do połączenia wszystkich punktów
– Wybierz najkrótszy odcinek spośród tych odcinków, które łączą jedno
z już połączonych miast z jakimkolwiek miastem jeszcze nie
połączonym.
26
3
Aa)
17
dd)
3
3
3
14
13
9
15
7
cc)
3
12
10
bb)
10
10
10
6
4
8
11
6
ee)
ff)
gg)
3
16
4
hh)
3
3
3
4
13
10
7
10
9
7
10
9
7
10
9
7
11
6
4
6
4
11
6
4
6
4
Programowanie dynamiczne
• Jest jedną z technik matematycznych poszukiwania
rozwiązań optymalnych
• Określa sposób podejścia do rozwiązywania problemu niż
jako pojedynczy uniwersalny algorytm.
Przykład programowania dynamicznego
• Problem znużonego wędrowca (problem znajdowania
najkrótszej ścieżki)
• Niech będzie dany następujący skierowany graf
acykliczny (spójny):
2
C
5
A
3
F
3
11
7
E
7
5
D
14
B
6
7
6
G
• Znużony wędrowiec ma dotrzeć z miasta A do miasta B.
• Zachłanne podejście do tego zadania dałoby w wyniku
następująca ścieżkę:
2
C
5
A
3
C
F
3
11
F
7
E
7
B
6
3
E
5
D
14
A
7
D
B
6
6
G
• Jej koszt całkowity wynosi 15.
6
G
• Najkrótsza droga pomiędzy A i B wynosi 13 i ma postać:
2
C
5
A
3
C
5
F
3
11
7
E
7
5
A
E
B
B
6
7
6
G
5
D
D
14
F
3
G
• Zachłanność w tym przypadku nie popłaca.
• Wyznaczenie optymalnego rozwiązania było możliwe
dzięki zastosowaniu programowania dynamicznego.
• W programowaniu dynamicznym istotną rolę odgrywa
zasada optymalności Bellmana.
• Mówi ona, że jeżeli znamy najlepsza drogę przejścia od
punktu początkowego do punktu końcowego prowadząca
przez kolejne punkty, to każdy fragment tej drogi
pomiędzy dowolnym punktem pośrednim a punktem
końcowym jest najlepszą droga przejścia od tego punktu
do punktu końcowego.
• Realizacja metody wygląda następująco:
• Niech L(X) – długość najkrótszej ścieżki z punktu X do B
2
C
5
A
3
F
3
11
7
E
7
5
D
14
B
6
7
6
G
L(B)=0, L(G)=6, L(E)=5, L(F)=7
L(D)=min(6+L(G), 7+L(E))=min(12, 12)=12
L(C)=min(3+L(E), 2+L(F))=min(8, 9)=8
L(A)=min(14+L(G), 3+L(D), 5+L(C))=min(20,15,13)=13
• Zatem najkrótsza ścieżka z miasta A do B wynosi 13 i
prowadzi przez miasta C i E.