Algorytmy i str ruktury danych Metody algorytmiczne Bartman Jacek jbartman@univ.rzeszow.pl
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 iteracje zagnieżdżone drzewa rekurencja
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 V S U W P Q X Y Z Lista wierzchołków w porządku prefiksowym: R V U W X Y Z S P Q
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 V S U W P Q X Y Z Lista wierzchołków w porządku postfiksowym: U X Y Z W V P Q S R
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 W U V X Ł S Y Z P Q Lista wierzchołków w porządku infiksowym: V W Y X Z R Ł U P S Q
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 4 2 1 5 8 7 Po pierwszym wywołaniu 4 2 1 5 8 7 Po drugim wywołaniu 4 2 1 5 8 7 Po trzecim wywołaniu 4 2 1 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: 2 10 7 17 12 15 1 9 14 4 8 1 11
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. 10 7 4 2 17 12 15 8 1 9 1 14 11 Aa) ee) 10 7 bb) 10 ff) 10 7 9 cc) 10 4 gg) 10 7 9 dd) 10 4 hh) 10 7 1 9 4 4 4 11 4 11
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): C 2 5 F A 14 11 7 D 7 E 5 7 B 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ę: C 2 5 F C F A 11 7 D 14 7 E 5 7 B A D E B G G Jej koszt całkowity wynosi 15.
Najkrótsza droga pomiędzy A i B wynosi 1 i ma postać: C 2 5 A 11 7 E D 14 7 5 F 7 B A 5 D C E 5 F B G 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 C 2 5 A 11 7 E D 14 7 G 5 F 7 B L(B)=0, L(G)=, L(E)=5, L(F)=7 L(D)=min(+L(G), 7+L(E))=min(12, 12)=12 L(C)=min(+L(E), 2+L(F))=min(8, 9)=8 L(A)=min(14+L(G), +L(D), 5+L(C))=min(20,15,1)=1 Zatem najkrótsza ścieżka z miasta A do B wynosi 1 i prowadzi przez miasta C i E.