Professional Documents
Culture Documents
Mwic bardzo nieformalnie, algorytm to pewien opis sposobu postpowania, ktre prowadzi do osignicia zamierzonego celu. Samo sowo "algorytm" pochodzi od nazwiska matematyka arabskiego Abu Ja'far Mohammed ibn Musa al Khowarizmi, ktry y na przeomie VIII i IX wieku na terenie obecnego Iraku. To nazwisko pisane po acinie przyjo posta Algorismus.
Kady algorytm skada si ze skoczonej sekwencji krokw, z ktrych kady wykonuje jedn lub wicej operacji. Oczywicie, kada taka operacja musi by jednoznacznie okrelona . Inn wan cech kadej operacji jest jej skoczono rozumiana w tym sensie, e kady krok winien by wykonywalny przez czowieka lub maszyn w skoczonym czasie.
Badania algorytmw mona rozpatrywa z co najmniej czterech rnych punktw widzenia widzenia: :
1. W jaki sposb tworzy algorytmy? Pytanie to dotyczy inwentyki algorytmw. Jest to sztuka, ktra zapewne nigdy nie zostanie w peni zautomatyzowana. Tym niemniej jednym z celw dodatkowych tego wykadu jest dokonanie przegldu rnych technik programowania, ktre okazay si skuteczne w dotychczasowych implementacjach.
2. W jaki sposb przedstawia algorytmy? Jak wiadomo, istnieje wiele metod, poczynajc od opisu sownego do programw komputerowych, ktre s sformalizowanymi opisami algorytmw w konkretnych jzykach programowania. Na pewno mona odrzuci zapis w postaci sieci dziaa jako zbyt rozwleky. Obecnie wikszo algorytmw publikuje si w jzyku, ktry nazwalimy Pseudo Pascalem.
3. W jaki sposb analizowa algorytmy? Wykonywanie algorytmu na komputerze powoduje angaowanie jego zasobw, takich jak: czas, pami, procesory. Analiza algorytmw dotyczy problemu okrelenia, ile czasu, ile pamici, wreszcie ile procesorw wymaga bdzie dany program oraz odpowiedzi na pytanie: czy wykonuje si on poprawnie i daje precyzyjne wyniki. Typowym zagadnieniem jest kwestia zachowania si algorytmu w najlepszym, rednim i najgorszym przypadku danych.
4. W jaki sposb testowa programy realizujce algorytmy? Przez testowanie rozumiemy tutaj zarwno uruchamianie, jak i profilowanie. Uruchamianie to prba wykonania programu na przykadowych danych dla stwierdzenia, czy daje on poprawne wyniki i jeli nie poprawienie go. Uruchamianie moe ewentualnie wykaza obecno bdw, a nie ich brak. Profilowanie jest procesem wykonywania poprawnego programu na pewnych interesujcych nas zestawach danych oraz mierzenie czasu i pamici zajmowanej przez ten program. Oczywicie, pojawia si tu pytanie, na jakich danych naley testowa programy.
Czynniki, ktre naley bra pod uwag przy numerycznym rozwizywaniu kadego problemu problemu: :
a) Struktury danych danych. . Jakie wielkoci s danymi rozwizywanego zadania? Jakie przestrzenie danych i wynikw najlepiej odpowiadaj sensowi fizycznemu rozwaanego problemu? Jaka jest zoono pamiciowa struktur danych? b) Efektywno. Co wiemy o zoonoci obliczeniowej naszego problemu? Jaka jest efektywno metod rozwizujcych dany problem? Czy rozpatrywany algorytm jest optymalny, tzn. czy miara kosztu jego wykonania jest rwna zoonoci problemu? Jeli nie, to czy jest to najtasza bd najprostsza ze znanych metod?
c) Jako numeryczna numeryczna. . Czy zadanie nie jest zbyt wraliwe na zaburzenia danych? Czy algorytm uyty do rozwizania jest odporny na bdy zaokrgle? Jeli nie, to czy istnieje metoda bardziej stabilna numerycznie? Jaka moe by utrata dokadnoci oblicze? d) Dokadno. Czy dany algorytm gwarantuje uzyskanie rozwizania optymalnego? Jeli nie, jaka jest dokadno danej heurystyki dla najgorszego przypadku danych? Dla jakich klas danych algorytm daje rozwizania optymalne? Jaki jest najmniejszy trudny algorytmicznie zestaw danych?
poprawno wymagania czasowe wymagania pamiciowe optymalno czasowa stabilno numeryczna prostota, zwizo wraliwo
Poprawno algorytmw
Nie mona udowodni matematycznie poprawnoci programu wykonujcego si na maszynie fizycznej, ale mona udowodni poprawno jego modelu matematycznego. Trzeba ustali, co oznacza poprawno, tzn. na jakich danych algorytm bdzie dziaa i jaki jest prawidowy wynik dla kadej danej. Dopiero wwczas mona przystpi do dowodu poprawnoci przyjtej metody. Po uoeniu algorytmu musimy udowodni, e algorytm ten dla dobrych danych robi to, co trzeba. Jest to szczeglnie istotne, gdy komputery decyduj o zdrowiu i yciu ludzi.
Rozpatrzmy dla przykadu zamian wartoci zmiennych liczbowych. Najprostsze rozwizanie to uycie zmiennej pomocniczej. Gdy przeniesiemy warto zmiennej x do zmiennej pomocniczej, potem warto zmiennej y do x i w kocu warto zmiennej pomocniczej do y, to oczywicie problem rozwizalimy. Ponadto algorytm jest tak prosty, e nie ma co dowodzi. Zamian wartoci zmiennych moemy zrealizowa rwnie, stosujc inny algorytm: dodajmy warto zmiennej y do wartoci zmiennej x i sum t przechowajmy jako now warto zmiennej x. Teraz za zmienn y podstawmy rnic nowej wartoci zmiennej x i wartoci zmiennej y i w kocu za zmienn x znw rnic wartoci zmiennych x i y.
W analizie algorytmw dany algorytm uwaa si za poprawny, gdy umiemy o nim udowodni dwa fakty. Pierwszy to tzw. wasno stopu, a wic to, i dla kadych danych dopuszczalnych algorytm ten zatrzymuje si i daje wynik. Drugi fakt, to taki, e wynik ten jest tym, czego szukalimy. Jeli potrafimy udowodni, e wynik dziaania algorytmu bdzie prawidowy, to mwimy o czciowej poprawnoci algorytmu lub te, e mamy do czynienia z palgorytmem. Zatem algorytm jest cakowicie poprawny, gdy jest czciowo poprawny i ma wasno stopu.
Jedn z metod dowodzenia poprawnoci jest metoda niezmiennikw ptli. Niezmienniki to warunki i relacje speniane przez zmienne i struktury danych na pocztku lub kocu kadej iteracji ptli. Niezmienniki ptli formuuje si tak, aby precyzyjnie stwierdzi, e po ostatniej iteracji algorytm zrobi to, co mia wykona. Metod niezmiennikw ptli zilustrujemy na przykadzie, w ktrym szukamy w tablicy (lub na licie) elementu o wartoci x. Algorytm porwnuje x kolejno z kadym elementem wektora i jeeli nastpi zgodno, to zwraca indeks danego elementu. Jeli x nie znajduje si na licie, to algorytm zwraca 0.
Algorytm 1
Dane: L, n, x, gdzie L jest tablic n-elementow L[l..n], za x jest wartoci poszukiwan. Wyniki: index, tj. pozycja x w L (lub 0, gdy nie wystpuje). begin 1. 2. 3. 4. 5. end;
index := 1; while index n and L[index] x do begin index := index + 1 end; if index > n then index := 0
Twierdzenie. Majc dan n-elementow tablic L (n 0) oraz Twierdzenie. x, algorytm 1 koczy si z wartoci index rwn pozycji pierwszego wystpienia x w L, jeli x wystpuje, i rwn 0 w przypadku przeciwnym. Lemat emat. . Dla kadego k = 1, 2, ..., n + 1, jeli sterowanie dociera do linii 2 po raz k-ty, to spenione s nastpujce niezmienniki ptli: index = k i L[i] x dla i = 1, 2, ..., k1.
Dowd - przez indukcj wzgldem k. Zgodnie ze schematem indukcji najpierw sprawdzamy, czy niezmiennik jest speniony przed rozpoczciem dziaania ptli. Niech k = 1. Wwczas index = k = 1 i nie istnieje i < k, dla ktrego L[i] = x. Jeeli, warunki te s spenione dla pewnego k < n + 1, to zachodz rwnie dla k + 1. Na podstawie zaoenia indukcyjnego L[i] x dla 1 i < k i index = k, gdy linia 2 wykonywana jest po raz k-ty z rzdu. Jeli warunki w linii 2 sprawdzane s ponownie, czyli po raz (k + 1)-szy, to byy one spenione poprzednio. Zatem L[index] x i L[k] x. Poza tym index jest zwikszany w ptli, wic (k + 1)-sze sprawdzenie warunkw oznacza, e index = k + 1.
Dowd twierdzenia twierdzenia. . Przypumy, e testy w linii 2 byy wykonane dokadnie k razy, gdzie 1 k n + 1. Rozwamy dwie moliwe sytuacje, w ktrych wykonuje si instrukcja warunkowa z linii 5. Wynik index = 0 jest wtedy i tylko wtedy, gdy k = n + 1. Na podstawie prawdziwoci niezmiennika ptli dla kadego i = 1,2, ..., n, L[i] x, wic wynik 0 jest prawidowy. Sytuacja ta zawiera przypadek, gdy n = 0 i lista jest pusta. Z drugiej strony wynik index = k n otrzymujemy wtedy i tylko wtedy, gdy ptla zakoczya si, poniewa na mocy lematu L[k] = x. Poniewa L[i] x dla i = 1, 2, ..., k 1, wic k jest pozycj pierwszego wystpienia wartoci x w tej tablicy. Zatem algorytm jest poprawny.
Znalezienie x na licie nazwisk Porwnanie x z pozycj na licie Mnoenie dwch macierzy liczb rzeczywistych Porzdkowanie liczb Mnoenie dwch liczb typu real (lub mnoenie i dodawanie) Porwnanie dwch liczb (lub porwnanie i zamiana)
Trawersowanie grafu w Operacja na wskaniku listy postaci listy ssiadw Tabela 4.1 Operacje podstawowe
Rozmiar danych
Rozmiar danych Liczba nazwisk na licie Liczba wierszy i kolumn Liczba kluczy do sortowania Trawersowanie grafu Liczba wierzchokw i liczba krawdzi Rozwizywanie ukadu Liczba rwna i liczba rwna liniowych niewiadomych Tabela 4.2 Problem Znalezienie x na licie nazwisk Mnoenie dwch macierzy Porzdkowanie liczb
W (n) = max{t ( I ) : I Dn }
A(n) =
p( I )t ( I )
I Dn
Problem: Niech L bdzie tablic n-elementow. Znale pozycj x, jeli L zawiera x, i zwrci 0 w przypadku przeciwnym. Algorytm: begin 1. 2. 3. 4. 5. end;
index := 1; while index n and L[index] x do begin index := index + 1 end; if index > n then index := 0
Operacja podstawowa: porwnanie x z pozycj na licie. Analiza najgorszego przypadku: w najgorszym przypadku x zajmuje ostatni pozycj lub w ogle nie wystpuje w L. W obu przypadkach x jest porwnywane ze wszystkimi pozycjami, zatem W(n) = n.
Analiza redniego przypadku: wszystkie elementy w L s rne, e x na pewno naley do L i, e x moe by na kadej pozycji z jednakowym prawdopodobiestwem. Zbir moliwych danych rozmiaru n dzielimy na klasy rwnowanoci wedug tego, na jakiej pozycji wystpuje x. Wystarczy rozway n typw danych wejciowych. Dla i = 1, 2, ..., n niech Ii reprezentuje przypadek, gdy x znajduje si na i-tej pozycji. Wwczas niech t(I) oznacza liczb porwna wykonywanych przez algorytm 1. t(Ii) = i dla kadego i = 1, 2, ..., n. Zatem:
1 1 n 1 n(n + 1) n + 1 = A(n) = p( I i )t ( I i ) = i = i = n i =1 n 2 2 i =1 i =1 n
n n
Obecnie rozwamy sytuacj, w ktrej x by moe nie znajduje si na licie, przy czym, jak poprzednio, wszystkie elementy s rne. Rozwaymy n + 1 przypadkw. Dla i = 1, 2, ..., n symbol Ii reprezentuje przypadek, gdy x jest na i-tej pozycji, In+l reprezentuje przypadek, gdy x nie ma na licie, za q oznacza prawdopodobiestwo, e x jest na licie, przy czym adna pozycja nie jest uprzywilejowana w sensie prawdopodobiestwa. Wwczas dla 1 i n mamy p(Ii) = q/n, p(In+1) = 1 q. Jak poprzednio t(Ii) = i oraz t(In+1) = n. Zatem: q q n A(n) = p( I i )t ( I i ) = i + (1 q)n = i + (1 q)n n i =1 i =1 i =1 n q n(n + 1) n +1 + (1 q )n + (1 q)n = q A(n) = n 2 2
n +1 n
Rozwaymy nastpujcy algorytm dla problemu polegajcego na rozstrzygniciu, czy dany graf G jest 3-barwny.
Algorytm 3-coloring(G); begin if w G istnieje K4 then return (nie) else begin wygeneruj wszystkie (3) 3-kolorowania grafu G for kade pokolorowanie do if legalne then return (tak) return (nie) end end;
Pokazano, e jeeli wszystkie grafy o n wierzchokach s jednakowo prawdopodobne, to prawdopodobiestwo, e algorytm wykona instrukcj else begin wynosi:
cn 2
oczekiwana
A(n) = ( ) (1 2
n 4
cn 2
) + (n 3 ) (2
2 n
cn2
) = O (n 4 )
Problem: Niech A = [aij] i B = [bij] bd dwiema macierzami kwadratowymi rozmiaru n n. Obliczy macierz C = A B. Algorytm: Zastosowa algorytm wynikajcy z definicji macierzy C:
cij = aik bkj
k =1 n
dla 1 i, j n.
Algorytm 2
begin for i := 1 to n do for j := 1 to n do begin cij := 0; for k := 1 to n do cij := cij + aik bkj end end;
Operacja podstawowa: mnoenie liczb zmiennoprzecinkowych. Analiza: aby obliczy jeden element macierzy, naley wykona n mnoe. Macierz C ma n2 elementw, wic:
A(n) = W (n) = n3
Dla niektrych algorytmw A(n) = W(n). Jednake obie funkcje mog si rni rzdem wielkoci. Przykadem takiego problemu jest zagadnienie sortowania. Naiwny algorytm sortowania dziaajcy na zasadzie porwnywania i ewentualnej zamiany par ssiednich wykonuje w najgorszym i rednim przypadku O(n2) porwna. Lepsze algorytmy sortowania wykonuj w obu przypadkach O(nlogn) porwna. Najlepsze algorytmy sortowania, oparte na idei podziau dystrybucyjnego, potrafi zrobi to samo w oczekiwanym czasie O(n), nie przekraczajc nigdy O(nlog n) dziaa.
KONIEC