Informatyka wprowadzenie do algorytmów (I) dr ha. inż. Mikołaj Morzy
jak zagotować wodę na heratę?
Muḥammad in Mūsā al-khwārizmī urodzony w Chorezmie, żył w latach ok. 780 - ok. 850 pracował w Domu Nauk w Bagdadzie największe dzieło to Hisa al dżar w'al muquaala zajmował się matematyką, geografią, astronomią i astrologią wprowadził do Europy indyjski system numeryczny twórca nowożytnej algery i trygonometrii równania liniowe i kwadratowe talice funkcji trygonometrycznych mapa współczesnego świata astrolaium i zegar słoneczny
metoda oliczania równań kwadratowych ogólne równania postaci x + x + c = 0 przykład: x + 10x 39 = 0 pole kwadratu wynosi x + 5 x + 5 x + 5 = 39 + 5 = 64 ok kwadratu wynosi zatem 8 szukana wartość x = 8 5 = 3 metoda działa dla dowolnych x = c + ( ) > 0, c < 0
zapis metody metodę al-khwarizmiego można zapisać następująco 1. podziel przez i wynik zapisz w pomocniczej zmiennej '. podnieś ' do kwadratu 3. dodaj do otrzymanej liczy wartość c 4. wyciągnij z sumy otrzymanej w (3) pierwiastek kwadratowy 5. odejmij od uzyskanej wartości zmienną ' 6. otrzymana licza jest szukanym nieujemnym pierwiastkiem równania x + x + c = 0 czy to ay na pewno jest poprawny krok? c > 0, c + ( ) > ( ) = = '
zadanie samodzielne zaprojektuj analogiczną metodę graficzną dla rozwiązania równania x = 5x + 6 5 1 x 6 x
co to jest algorytm? przepis postępowania który prowadzi do uzyskania rozwiązania zadania w skończonej liczie kroków przepis kucharski zapis nutowy muzyki instrukcja montażu mela opis dojazdu układ choreograficzny
cechy algorytmu sposó zapisu język naturalny schemat lokowy instrukcje programu pseudokod sposó zapisu musi pozwalać na wyrażenie sekwencyjności wyoru iteracji rekursji
sekwencyjność sekwencyjność odnosi się do konieczności wykonania kroków algorytmu zgodnie z kolejnością ich zapisu 1. weź 4 jajka, szklankę cukru i cukier waniliowy. utrzyj żółtka z cukrem 3. przygotuj szklankę mąki z łyżeczką proszku do pieczenia 4. dodaj część mąki do ucieranej masy 5. uij pianę z iałek 6. dodaj do ucieranej masy pianę i resztę mąki 7.
wyór opis algorytmu może zawierać wiele alternatywnych ścieżek wiodących do celu jeżeli ucierana masa jest zyt gęsta to wtedy dodaj łyżkę wody jeżeli gracz odpowiedział poprawnie na 3 pytania, to wówczas przechodzi do następnego etapu, w przeciwnym wypadku odpada jeżeli wyróżnik trójmianu kwadratowego jest ujemny, to piszemy ze trójmian nie ma pierwiastków, jeżeli wyróżnik jest równy zero, to piszemy ze trójmian ma jeden pierwiastek, w pozostałych przypadkach trójmian ma dwa pierwiastki
iteracja iteracja pozwala powtórzyć fragment algorytmu określoną liczę razy lu powtarzać fragment algorytmu aż do momentu zajścia pewnego warunku podgrzewaj masę mieszając, dopóki cukier się nie rozpuści powtórz 100 razy czynność "dodaj łyżeczkę wody"
rekurencja rekurencja oznacza podział prolemu na mniejsze zagnieżdżone podprolemy o identycznej strukturze i rozwiązanie podprolemów przez algorytm nadrzędny Przykład (informatyk pod prysznicem) nanieść na rękę niewielką ilość szamponu wymyć włosy szamponem i następnie spłukać czynność powtórzyć
rzeczywisty przykład rekurencji silnia: n! = 1** K*( n 1) * n function silnia(int n) { function silnia(int n) { if (n==1) then return 1; else return n * silnia(n-1); }
pisanie algorytmów czy rozumiemy, co potrafi zroić komputer? podejście redukcjonistyczne podziel prolem na mniejsze i prostsze podprolemy zaprojektuj rozwiązania dla poszczególnych modułów, w razie konieczności podziel podprolem na mniejsze elementy zapisz algorytm w wyranym języku programowania top-down design, od ogółu do szczegółu programowanie jest jedno, jest tylko wiele języków
Euklides z Aleksandrii żył w latach ok. 365 p.n.e. ok. 300 p.n.e. ojciec współczesnej geometrii największe dzieło to Elementy definicja całej geometrii teoria licz związek między liczami doskonałymi i liczami pierwszymi Mersenne'a lemat o faktoryzacji iloczynu przez liczy pierwsze (podstawowe twierdzenie arytmetyki) algorytm znajdowania największego wspólnego dzielnika
algorytm Euklidesa dane są dwie nieujemne liczy całkowite a i takie, że a+ > 0. Wyznacz największą liczę całkowitą c taką, że a mod c = 0, mod c = 0. Liczę c nazywamy największym wspólnym dzielnikiem licz a i i oznaczamy przez (a,) ( a, ) = a if = 0 ( a, ) if > 0 przykład ( 84,36) = (48,36) = (1,36) = (36,1) = (4,1) = (1,1) = (0,1) = (1,0) = 1
zadanie samodzielne udowodnij, że powyższa procedura w skończonej liczie kroków prowadzi do rezultatu (czyli jest poprawnym algorytmem) odpowiedź oa argumenty są po każdym kroku nieujemne zatem suma ou argumentów po każdym kroku jest nieujemna suma argumentów po każdym kroku maleje ciąg licz naturalnych nie może ściśle maleć w nieskończoność
algorytm Euklidesa (wersja 1) function Euclid_1 (int a, int ) { while ( > 0) { if (a < ) then swap(a,); a := a ; } return a; } w kryptografii często 10 18 przeanalizujmy najgorszy możliwy przypadek, a=10 30, =1 załóżmy, że jedna pętla wykonuje się w 0.1 nanosekundy (10-10 s) w ciągu doy wykona się 86400*10 10 pętli w ciągu roku wykona się 365*10 13 pętli od Wielkiego Wyuchu minęło 14 mld lat, czyli 5*10 8 orotów pętli jeśli komputer został uruchomiony na początku istnienia Wszechświata, to zdążył już wykonać około 0% oliczeń
algorytm Euklidesa (wersja ) function Euclid_ (int a, int ) { while ( > 0) { a := a mod ; swap(a,); } return a; } odejmowanie yło potrzene tylko do wyznaczenia reszty z dzielenia od a zawsze odejmujemy całkowite wielokrotności reszta z dzielenia jest zawsze mniejsza od dzielnika a jaki jest najgorszy możliwy przypadek? (1,0)(,1)(3,)(5,3)(8,5)(13,8), jeśli w danym orocie pętli jest (a,), to w poprzednim powinno yć (a+,)
Leonardo Pisano Bigollo żył w latach ok. 1170 ok. 150 ardziej znany jako Fionacci wprowadził do Europy liczy araskie główne dzieło to Lier Aaci adania nad populacją królików ciąg Fionacciego, kolejne pary tworzą złoty podział
liczy Fionacciego definicja F = 0 n 1, F = 1 1, F = + n Fn F 1 1,1,,3,5,8,13,1,... ogólna formuła F n = 1 n n 5 1+ (( 5 ) 1 ( 5 ) ) oznaczmy mamy 1+ 5 1 5 Φ = = 1.618... Φ ' = = 0.318... F n = 1 ( Φ 5 n Φ' n ) 1 Φ 5 n licza rośnie wykładniczo względem indeksu indeks rośnie logarytmicznie względem liczy a po zlogarytmowaniu logφ Fn = n logφ 5 n = logφ Fn + log Φ 5
no i mamy nowy kłopot dla liczy 30-cyfrowej licza pętli to zamiast odejmowania używamy dzielenia z resztą wyznacz cyfrę wyniku przemnóż cyfrę wyniku przez dzielnik log odejmij wynik iloczynu od fragmentu dzielnej 10 30 = wykonaj powyższą procedurę tyle razy, ile cyfr ma iloraz w każdej pętli wykonujemy O(n ) kroków Φ 148.33K licza orotów głównej pętli też jest proporcjonalna do n w każdym systemie pozycyjnym licza cyfr jest proporcjonalna do logarytmu z danej liczy przy podstawie ędącej podstawą systemu łączna licza operacji rzędu O(n 3 ) kroków
rozwiązanie prolemu czy można znaleźć algorytm wyznaczania największego wspólnego dzielnika, który, zachowując złożoność kwadratową, wykorzystywały prostsze operacje niż dzielenie z resztą? = a a 0 = P a a P P a a P P a a P a a a, ), (, ), (, ), (, ), ( ), ( jeśli licza jest parzysta, to rozwiązanie nie zmieni się, jeśli licza parzysta zostanie podzielona przez dzielenie przez wymaga sprawdzenia jedynie ostatniej cyfry w liczie
algorytm Euklidesa (wersja 3) function Euclid_3 (int a, int ) { int nwd := 1; while ( > 0) { if (a < ) then swap(a,); if (even(a) & even()) then { nwd := nwd * ; a := a div ; } := div ; } else if (even(a) &!even()) then a := a div ; else if (!(even(a) & even()) then := div ; else a := a ; } return (nwd * a);
algorytm Euklidesa (wersja 3) : analiza w każdym kroku alo argument jest połowiony, alo staje się parzysty w wyniku odejmowania i zostanie przepołowiony w kolejnej pętli maksymalna licza orotów pętli to *(log a + log ) wewnątrz pętli wszystkie operacje mają złożoność liniową złożoność operacji na cyfrach wynosi O((log ) ) a
dziedzina algorytmiczna dziedziną algorytmiczną algorytmu A nazywamy krotkę A,{ o i } r i I,{ j} j J zawierającą nośnik, ziór operacji i ziór relacji których można używać w algorytmie. Euklides 1: Euklides : Euklides 3: N,,, = 0 N, mod, = N,, = 0,*,, P, 0
złożoność algorytmu oliczamy liczę operacji dominujących złożoność wyznaczamy z dokładnością do rzędu wielkości f : N R jest O(g) jeśli istnieją c > 0, m N, takie, że dla każdego n > m zachodzi f(n) cg(n) złożoność zależy od rozmiaru danych sortowanie n oiektów, rozmiarem jest n algorytmy grafowe, rozmiarem jest suma liczy wierzchołków i krawędzi algorytmy liczowe, rozmiarem jest długość zapisu cyfrowego liczy jeśli algorytm wymaga pamięci na pomocnicze struktury, to uwzględniamy złożoność pamięciową w zależności od danych mówimy o złożoności pesymistycznej i złożoności losowej