dr Anna Kwiatkowska Instytut Informatyki Algorytmy dr Anna Kwiatkowska Instytut Informatyki
أبو عبد الله محمد بن موسى الخوارزمي Słowo algorytm pochodzi od nazwiska arabskiego matematyka Abu Ja’far Mohammad ibn Musa al-Chorezmi, który żył na przełomie VIII i IX wieku na terenach obecnego Uzbekistanu
Algorytmy Jego nazwisko pisane po łacinie przyjęło postać: Algorismus Jest on uznawany za prekursora metod obliczeniowych w matematyce Jeden z najstarszych algorytmów, algorytm Euklidesa znajdowania największego wspólnego podzielnika dwóch liczb ma ponad 2000 lat
Algorytm Euklidesa Co ciekawe algorytmu nie wymyślił Euklides, a Eudoksos z Knidos w IV wiek p.n.e. Euklides jedynie algorytm ten zawarł i udowodnił jego poprawność w swoim dziele Elementy Największy Wspólny Dzielnik (NWD) dwóch liczb jest największą liczbą naturalną spośród tych, które dzielą obie te liczby bez reszty W codziennej praktyce NWD służy nam do skracania ułamków do postaci właściwej
Algorytm Euklidesa Dane: n, m – dwie liczby naturalne. Dane wyjściowe liczba naturalna będąca największym wspólnym dzielnikiem liczb n i m. W pierwszej sekcji algorytmu sprawdzamy czy m>n i jeżeli tak jest to zamieniamy miejscami wartości zmiennych m i n, aby był spełniony wymagany warunek m<=n
Algorytm Euklidesa Sprawdzamy, czy m≠0, jeśli tak, to następne czynności wykonujemy aż do momentu gdy m=0 rob = n - ( n DIV m) *m n = m m = rob DIV jest operatorem dzielenia całkowitego Wynik jest w zmiennej n
Algorytm Euklidesa rob m n m>n 12 18 12 6 12-(12div6)*6 ? 18 12 ? 6 jeśli m>n to przestawić m z n jeśli m ≠ 0 obliczaj: rob = n - ( n DIV m) *m n = m m = rob rob m n m>n 12 18 12 6 12-(12div6)*6 ? 18 12 ? 6 18-12 12-2*6 18-(18div12)*12 12 6 ? NWD = 6
Algorytm Algorytm jest to sformalizowany ciąg logicznie powiązanych instrukcji (poleceń, rozkazów), których wykonanie pozwoli na przetworzenie informacji wejściowych (danych) w informacje wyjściowe (wyniki) w skończonej liczbie kroków
Przepisy kucharskie Zapis nutowy muzyki. Instrukcje montażu Opisy dojazdu
wśród prekursorów algorytmów komputerowych ważną rolę odegrała Ada Augusta, hrabina Lovelace, córka Byrona, która żyła w latach 1815 – 1852, uważa się ją za pierwszą programistkę
Rozwiązanie zadania • analiza treści zadania • wykaz danych wejściowych; wiadomych i niewiadomych oraz relacji między nimi • sprawdzenie czy zadanie posiada jednoznaczne rozwiązanie • wybór metody rozwiązania zadania • opis czynności, które należy wykonać z danymi wejściowymi przy zastosowaniu wybranej metody rozwiązania • sporządzenie i przedstawienie wyników rozwiązania zadania
Użyteczność algorytmu Algorytm jako pewna określona procedura obliczeniowa posiada cechy, które określają jej użyteczność: 1) poprawność 2) złożoność obliczeniowa 3) złożoność czasowa
Formuła częściowej poprawności programu Trójka to formuła logiczna, która jest prawdziwa wtedy i tylko wtedy, gdy zachodzi następujący warunek: Dla każdego stanu spełniającego , jeżeli program zakończy swoje działanie, to stan końcowy będzie spełniał formułę
Formuła częściowej poprawności programu Takie formuły nazywamy trójkami Hoare'a albo formułami częściowej poprawności programu Zostały wprowadzone przez jednego z największych informatyków, Anthony'ego Hoare'a, w połowie lat 60
Zauważmy, że o poprawności formuły Hoare'a możemy mówić w dwóch przypadkach: Kiedy dla danych spełniających program się zatrzyma i dane po zatrzymaniu się programu spełniają Kiedy dla danych spełniających program się nie zatrzyma
Przykład Udowodnijmy, że jeśli k>0, to po instrukcji j:=k+1 mamy j>0 Ponieważ mamy po prawej stronie instrukcji przypisania wyrażenie k+1, więc musimy warunek początkowy zapisać w równoważnej formie, w której miejsce zmiennej k zajmuje wyrażenie k+1 Zatem jest k>0 równoważne k+1>1 i stosując regułę dla instrukcji przypisania otrzymujemy, że j>1 co akurat w przypadku zmiennych całkowitych jest równoważne j>0
Poprawność algorytmów Jeśli program jest częściowo poprawny i ma własność stopu jest gwarancja uzyskania żądanego wyniku Jak zatem wywnioskować, czy program się zatrzyma Metoda opracowana przez Roberta Floyda w latach sześćdziesiątych korzysta z zasady indukcji Chodzi o pokazanie, że pewna wartość, maleje w każdym obrocie pętli, a zmniejszanie to nie może się ciągnąć w nieskończoność
Złożoność algorytmów Złożoność obliczeniowa algorytmu jest określana ilością zasobów systemu liczącego potrzebnych do jego wykonania Podstawowymi zasobami są: czas procesora i obszar pamięci, czyli czas działania algorytmu oraz ilość zajętej pamięci Parametry te mają największy wpływ na złożoność obliczeniową
Złożoność algorytmów Wyróżniana jest złożoność czasowa złożoność pamięciowa Złożoność czasowa zależy od wszystkich jednostkowych czynności wykonywanych podczas realizacji algorytmu Jedne czynności wykonywane są wolniej inne szybciej
Czynności jednostkowe Zazwyczaj jako czynności jednostkowe przyjmuje się: wykonanie operacji arytmetycznej (dodawanie, odejmowanie, mnożenie, dzielenie i in.); nadanie wartości zmiennej; zbadanie relacji lub wykonanie operacji logicznej; wprowadzenie danej; i in.
Przykład Określ czynności jednostkowe obliczania wartości wyrażenia w(x) określonego wzorem: dla danej wartości x.
Razem 16 operacji jednostkowych Rozwiązanie Wersja I (nieoptymalna). w = 3*x*x*x*x*x*x + 2*x*x*x*x + 5*x*x +10 Liczba operacji jednostkowych: - 1 przypisanie - 3 dodawania - 12 mnożeń. Razem 16 operacji jednostkowych
Rozwiązanie Wersja II. w = x * x w = ((3*w + 2)*w + 5)*w + 10 Liczba operacji jednostkowych: - 2 przypisania - 3 dodawania - 3 mnożenia. Razem 8 operacji jednostkowych.
Złożoność algorytmów często dokładne zliczanie operacji jednostkowych jest bardzo trudne lub niemożliwe i w związku z tym wyróżnia się tzw. operacje dominujące za operacje dominujące w danym algorytmie uważa się te, których liczba jest proporcjonalna do liczby wykonań wszystkich operacji jednostkowych w dowolnej komputerowej realizacji tego algorytmu za jednostkę złożoności czasowej przyjmuje się wykonanie jednej operacji dominującej
Złożoność algorytmów Złożoność pamięciowa określa zapotrzebowanie algorytmu na pamięć Za jednostkę złożoności pamięciowej przyjmuje się zwykle słowo pamięci komputera
Złożoność algorytmów Dla większości algorytmów trudno jest określić dokładnie złożoność obliczeniową, która między innymi w większości przypadków zależy od liczby danych wejściowych (rozmiaru danych) W takich przypadkach bywa wyróżniana złożoność pesymistyczna oraz złożoność oczekiwana algorytmu
Pesymistyczna złożoność czasowa Pesymistyczna złożoność czasowa algorytmu określana jest funkcją w(n): gdzie: n – rozmiar danych sup – kres górny zbioru t(d) – liczba operacji dominujących dla zestawu danych wejściowych d Dn – zbiór zestawów danych wejściowych o rozmiarze n.
Oczekiwana złożoność czasowa Oczekiwana złożoność czasowa algorytmu określana jest funkcją A(n): gdzie: A(n) – wartość oczekiwana zmiennej losowej Xn Xn - wartością tej zmiennej losowej jest liczba operacji dominujących dla zestawu danych wejściowych dDn pnk – prawdopodobieństwo, że dla danych o rozmiarze n algorytm wykona k operacji dominujących.
Przykład Określ złożoność czasową algorytmu wyszukiwania elementu a w N elementowym ciągu L Rozwiązanie. Dane początkowe: N – liczba naturalna (N 0) a – poszukiwany element L – ciąg elementów { lj }, j=1,...,N
Założenia: N - rozmiar danych wejściowych (n=N), Xn - zmienna losowa określająca prawdopodobieństwo wystąpienia a na danym miejscu w ciągu L. Element równy a może wystąpić na każdym miejscu jednakowym prawdopodobieństwem – rozkład jednostajny. Zatem pnk=1/N. Wynikiem algorytmu jest wartość logiczna q określona następująco: q = 0 (fałsz) gdy żaden z elementów l1,..., lN nie jest równy a q 0 (prawda) gdy w ciągu L występuje element równy a
Przykład Operacja dominująca: lj a Rozwiązanie. Pesymistyczna złożoność czasowa: w(N)=N+1 Oczekiwana złożoność czasowa: . Z powyższych obliczeń wynika, że funkcja złożoności czasowej jest funkcją liniową operacji dominujących.
Własności poprawnie sformułowanego algorytmu 1) uniwersalność – pozwala na rozwiązanie całej klasy zadań; 2) ścisłość – zarówno czynności algorytmu, jak i kolejność ich wykonania jest opisana dostatecznie jasno i wyraźnie; 3) jednoznaczność – wielokrotne wykonywanie algorytmu dla identycznych danych prowadzi do takich samych wyników;
Własności poprawnie sformułowanego algorytmu 4) kompletność – algorytm uwzględnia wszystkie możliwe przypadki zdarzeń, jakie mogą wystąpić podczas jego wykonania; 5) skończoność – rozwiązanie zadania otrzymamy po skończonej ilości czynności (kroków algorytmu).
Przykład a x2 + b x + c = 0 Znany algorytm wyznaczenia pierwiastków rzeczywistych trójmianu kwadratowego o współczynnikach rzeczywistych ma cechy poprawnego algorytmu, gdyż charakteryzują go : uniwersalność – algorytm rozwiązuje dowolne równanie kwadratowe określone przez trójkę liczb a, b, c gdzie a0 oraz a,b,c;
Przykład ścisłość – opisany wzorem matematycznym sposób obliczenia delty jako pierwszy krok, badanie znaku delty i w zależności od uzyskanej odpowiedzi wyznaczenie pierwiastków przy pomocy wzorów matematycznych skończoność – po kilku krokach algorytmu otrzymamy wynik.
Przykład jednoznaczność – zawsze dla tych samych współczynników uzyskamy te same odpowiedzi, gwarantują nam to wzory matematyczne kompletność – wszystkie przypadki, czyli delta>0, delta=0 oraz delta<0 są uwzględnione
Sposoby zapisu algorytmu opis słowny zapis przy pomocy pseudo-kodu zapis graficzny (schematy) zapis w języku programowania
Opis słowny Opis słowny jest to zapis kolejnych kroków algorytmu w języku naturalnym np. polskim wyszczególniamy, jakie czynności należy wykonać zaznaczamy, kiedy powinien nastąpić koniec algorytmu
Przykład Dany jest: punkt płaszczyzny P(xp,yp) środek S(a,b) długość promienia r okręgu o równaniu (x-a)2+(y-b)2=r2. Określić położenie punktu P względem tego okręgu.
Przykład Oznaczamy d - odległość punktu od okręgu. Jeżeli d<r, to punkt leży wewnątrz okręgu, jeżeli d=r, to punkt leży na okręgu a gdy d>r, to punkt leży na zewnątrz r S
Opis słowny algorytmu Pobierz wartości xp ,yp, a, b, r. Oblicz odległość punktu według wzoru Sprawdź, czy d<r , jeśli TAK, to „punkt wewnętrzny” i przejdź do KONIEC. Sprawdź, czy d=r, jeśli TAK, to „punkt leży na okręgu” i przejdź do KONIEC „Punkt leży na zewnątrz okręgu” KONIEC
Opis algorytmu zamek który??? język naturalny jest ze swej natury niejednoznaczny który??? zamek
Pseudo - kod Do zapisania algorytmu w postaci na wpół sformalizowanej służy pseudo-kod Jest to sposób zapisu wybranej metody oparty na języku naturalnym (polskim lub angielskim), ale narzucający przy tym pewną dyscyplinę w formułowaniu zdań Reguły dotyczące formułowania opisu postępowania są zaczerpnięte najczęściej z wybranego języka programowania i mają za zadanie zapewnić jednoznaczność zapisu
Pseudo - kod Podstawowymi elementami pseudo-kodu są zdania, nazywane inaczej instrukcjami Słowa, które są podstawą budowy tych zdań i zawsze muszą w nich wystąpić dla wyróżnienia są podkreślane i nazywane słowami kluczowymi Obecnie najbardziej rozpowszechniona jest notacja pascalo-podobna, czyli pseudo-kod oparty na regułach języka PASCAL
Pseudo - kod Każda instrukcja pseudo-kodu powinna zaczynać się od nowej linii W zapisie tym należy przestrzegać także wcięć i i czytelnego rozłożenia tekstu Instrukcje zagłębione w innych są wcięte o kilka znaków, żeby zależności pomiędzy nimi były widoczne graficznie
Pseudo - kod Nawiasy instrukcji grupujących powinny być zapisane tak, aby od razu było widać, które z nich tworzą parę Reguły te pozwalają zwiększyć czytelność zapisu ułatwiają analizę zapisanych algorytmów
Pseudo - kod Pseudo-kod umożliwia w łatwy sposób rozwijać zapisane już instrukcje poprzez dopisywanie nowych i grupowanie je w odpowiedni sposób Dzięki tej własności można przy jego pomocy czytelnie zapisywać złożone algorytmy
Pseudo-kod W tym zapisie możemy używać następujących zdań: instrukcja określająca czynność do wykonania, nie posiada słów kluczowych, np. zwiększ wartość zmiennej x o jeden instrukcje te oddzielane są od siebie słowem kluczowym a następnie
y x i 4 3 3 10 7 x := 7 x:=x+1 3+1 4 y := 3 I := 7 x 10 + 3 y x:= y ?
Pseudo-kod instrukcja wyboru (decyzyjna) zawiera strukturę opisującą decyzje podejmowane w algorytmie i ich skutki wyboru dokonuje się na podstawie określonego kryterium (warunku), które jest wyrażeniem logicznym
Postacie instrukcji warunkowej skrócona - posiada dwa słowa kluczowe i ma postać: jeżeli warunek to instrukcja np. jeżeli dziecko skończyło 6 lat to zapisz je do szkoły; pełna – posiada trzy słowa kluczowe i ma postać: jeżeli warunek to instrukcja1 w przeciwnym wypadku instrukcja2 np. jeżeli kupiłeś samochód to zrób prawo jazdy w przeciwnym wypadku zatrudnij szofera
Instrukcja warunkowa – postać skrócona to jeżeli warunek FALSE x>4 TRUE Większy!!!! ; instrukcja; czynności bez względu na to czy większy; ciąg dalszy programu;
Instrukcja warunkowa – postać pełna jeżeli warunek wtedy FALSE TRUE instrukcja 1 w przeciwnym wypadku instrukcja 2;
jeżeli > stan mojego konta 1 000 000 $ to w przeciwnym wypadku
instrukcja iteracyjna warunkowa opisuje sytuację, w której pewne czynności należy powtarzać dopóki podany warunek jest spełniony; powtarzanie czynności opisanych instrukcją kończy się, gdy warunek przestaje być prawdziwy, posiada ona dwa słowa kluczowe i ma postać: podczas, gdy warunek wykonuj instrukcja np. podczas, gdy jest w kasie gotówka wykonuj realizuj polecenie wypłaty
Instrukcja iteracyjna warunkowa MUSI zmieniać elementy warunku! godzina = 8.00 podczas, gdy TRUE godzina < 10 8 10<10 warunek TRUE 9 < 10 FALSE wykonuj PRZERWA! Na Kit-Kat PRACUJ! instrukcja ZEGAR: godzina=godzina +1 9 8 10
instrukcja iteracyjna może być używana w sytuacji, gdy pewne czynności należy wykonać określoną liczbę razy posiada dwa słowa kluczowe i ma postać: dla wykaz sytuacji wykonuj instrukcja np. dla każdego studenta z roku wykonuj wystaw ocenę końcową;
Koniec spacerów! ( dla ) nie ma psów Azor, King, Lady, Drab, wykonuj wyprowadź na spacer Koniec spacerów!
Instrukcja iteracyjna mam pięć fajerwerków, zatem: dla i= 3, 4, 5 2, 1, wykonuj odpal fajerwerk zabrakło fajerwerków
Instrukcja iteracyjna warunkowa wykonuj 2 1 wyświetl wartość ‘i’ na ekranie i= i+1 3 2 aż do momentu gdy KONIEC!! i>2 FALSE i>2 TRUE 3 2
instrukcja grupująca instrukcja ta zamiast słów kluczowych używa symboli nawiasu klamrowego i ma postać: { instrukcja 1 a następnie instrukcja 2 ... instrukcja n }
instrukcja grupująca służy do zaznaczenia, że daną grupę instrukcji trzeba traktować jako całość używana w sytuacji, gdy w danym miejscu reguły zapisu wymagają tylko jednego zdania, a potrzebna jest więcej niż jedna instrukcja
Zapis graficzny Zapis graficzny algorytmu można zrealizować w postaci: schematu blokowego zorientowanego; schematu zwartego NS (Nassi – Shneidermana )
Schemat zorientowany nie używa się go od 30 lat umożliwia niestrukturalny zapis algorytmu możliwy jest skok w dowolne miejsce schematu
klatka początku algorytmu klatka kończąca algorytm START klatka początku algorytmu klatka kończąca algorytm pobieranie danych do przetwarzania, wyprowadzanie wyników, klatka operacji bezwarunkowej, klatka decyzyjna, klatka iteracyjna, STOP WE WY TAK NIE
Schemat blokowy zorientowany Poszczególne klatki schematu łączy się strzałkami, których zwrot określa kolejność wykonywanych kroków algorytmu Zapis w postaci schematu zorientowanego może prowadzić do programów niestrukturalnych, gdyż umożliwia przeskok z dowolnego miejsca algorytmu w inne Dlatego też powstały schematy zwarte NS, które zastąpiły schematy blokowe zorientowane
Schematy NS Schematy zwarte NS poprzez to, że składają się ze zwartych bloków uniemożliwiają zapis skoków wewnątrz algorytmu, zmuszając programistę do myślenia strukturalnego Sposób rozwiązania danego problemu zapisany w postaci schematu zwartego jest łatwiejszy do zrozumienia przez osoby postronne Zapis algorytmu w postaci schematu NS ułatwia sprawdzenie jego poprawności, a co za tym idzie, programy pisane według tego typu schematów zawierają mniej błędów
instrukcje refrenu wykonują się wtedy, gdy warunek jest spełniony instrukcja imperatywna, określająca czynność do wykonania, której opis wpisuje się wewnątrz klatki wprowadzanie danych, wykaz danych do wprowadzenia wpisuje się wewnątrz klatki, w trójkącie można wpisać numer urządzenia wejścia wyprowadzanie wyników, wykaz wartości do wyprowadzenia wpisuje się wewnątrz klatki, w trójkącie można wpisać numer urządzenia wyjścia instrukcja decyzyjna (wyboru) jeśli, czynność dane wyniki warunek Tak Nie instr1 instr2 warunek refren instrukcje refrenu wykonują się wtedy, gdy warunek jest spełniony refren warunek instrukcje refrenu wykonują się aż do chwili, gdy warunek zostanie spełniony
Schematy NS zadanie, dla którego zostaną przedstawione algorytmy jego rozwiązania przy użyciu każdej z opisanych wyżej instrukcji iteracyjnych dzięki temu widoczne będą różnice w zastosowaniu każdej z nich należy zaznaczyć, iż są zadania, których algorytmy rozwiązań nie dadzą się zrealizować przy użyciu instrukcji iteracyjnej „dla” instrukcja ta jest więc węższa w zastosowaniu w porównaniu z dwoma pozostałymi instrukcjami iteracyjnymi
Schemat NS Obliczyć sumę i iloczyn podanych 4 liczb. Schemat zwarty algorytmu, który generuje żądany wynik przy użyciu: instrukcji iteracyjnej „while” rozwiązanie 1 instr. iteracyjnej „dopóki” rozwiązanie 2 instrukcji iteracyjnej „dla” rozwiązanie 3
Rozwiązanie 1 . Schemat obliczania sumy i iloczynu podanych trzech liczb {2,5,10} z wykorzystaniem pętli „podczas gdy” S:=0, Il:=1 n:=1 n <= 3 S 17 2 7 „Podaj liczbę: ” Il 10 2 1 100 a S:= S+a Il:=Il*a n 4 3 2 1 n:= n+1 warunek pętli a 10 5 2 KONIEC Suma=17 Iloczyn=100 ? TRUE FALSE 4 3 1 2 n<=3
Rozwiązanie 2 . Schemat obliczania sumy i iloczynu podanych trzech liczb { 2,5,10} z wykorzystaniem pętli „dopóki” S:=0, Il:=1 S 7 2 17 n:=1 „Podaj liczbę: ” Il 1 100 10 2 a n S:= S+a 1 3 4 2 Il:=Il*a a 2 10 5 n:= n+1 n > 3 warunek pętli 4 3 TRUE 2 n>3 FALSE KONIEC Suma=17 Iloczyn=100
Rozwiązanie 3 .Schemat obliczania sumy i iloczynu podanych 3 liczb {2,5,10} z wykorzystaniem pętli „dla” licznik pętli n S:=0, Il:=1 1 2 4 3 n = 1 .. 3 „Podaj liczbę: ” a a 2 5 10 S:=S+a Il:=Il*a S 7 2 17 Il 2 Suma=17 Iloczyn=100 1 100 10 KONIEC