Wioletta Karpińska
Wydział Matematyki i Informatyki Uniwersytet Łódzki
Zajęcia na DUM I w 2017
Strona:
http://www.math.uni.lodz.pl/~karpinw Zaliczenie: do ustalenia.
Programowanie:
http://www.instalki.pl/programy/download/
Windows/srodowiska_programistyczne/Dev -C_5.html
DevC++
jest w pełni funkcjonalnym darmowym środowiskiem programistycznym C/C++ zawierającym wielookienkowy edytor kodu źródłowego z podświetlaniem składni, kompilator, debbuger, linker. Środowisko posiada także narzędzie do tworzenia pakietów instalacyjnychnapisanych programów. Instalacja jest prosta i ogranicza się do postępowania zgodnie z instrukcjami.
Banachowski L., Kreczmar A.: Elementy analizy algorytmów.
Banachowski L., Diks K., Rytter W.: Algorytmy i struktury danych.
Cormen T.H., Leiserson Ch.E., Rivest R.L.: Wprowadzenie do algorytmów .
Ross K.A., Wright Ch.R.B.: Matematyka dyskretna.
Sedgewick R.: Algorytmy w C++.
Sedgewick R., Flajolet P.: An Introduction to the Analysis of
Algorithms.
Ogólnie o
algorytmach Podstawowe narzędzia matematyczne
Poprawność algorytmów
Złożoność obliczeniowa i pamięciowa
Algorytmy rekurencyjne Wybrane algorytmy
sortowania
Struktury danych Algorytmy przeszukiwania
Algorytmy numeryczne
Algorytm – w matematyce oraz informatyce skończony, uporządkowany ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego rodzaju zadań.
Słowo "algorytm" pochodzi od starego angielskiego słowa algorism , oznaczającego wykonywanie działań przy
pomocy liczb arabskich (w odróżnieniu od abacism - przy pomocy abakusa), które z kolei wzięło się od nazwiska
Muhammed ibn Musa Alchwarizmi ( ىسوم نب دمحم الله دبع وبأ يمزراوخلا
) matematyka perskiego z IX wieku
[1].
Źródło: Wikipedia
Algorytm -opis czynności składających się na proces przetwarzania zadanych obiektów
początkowych (wejściowych) w celu otrzymania obiektów wynikowych (wyjściowych).
Algorytm możemy również traktować jako sposób rozwiązywania konkretnego problemu.
Postawienie problemu polega na sprecyzowaniu wymagań dotyczących relacji między danymi
wejściowymi i wyjściowymi, a algorytm opisuje
właściwą procedurę, która zapewnia, że ta relacja
zostanie osiągnięta.
Algorytm – metoda rozwiązywania danego problemu,
która spełnia warunki:
Istnieje określony
stan po- czątkowy
Istnieje wyróżnio-
ny koniec
Warunek jednoznaczności
- jednoznaczna interpretacja poszczególnych
kroków metody
Warunek efektywności – cel musi być osiągany
w pewnym skończonym i
możliwym do przyjęcia przez użytkownika czasie Warunek
uniwersalności – możliwość stosowania metody
do całej klasy zagadnień Warunek dyskretności – skończona ilość
operacji potrzebnych do
rozwiązania
•Możliwe do wykonania przez
wykonawcę
•Dowolny,
zrozumiały dla wykonawcy
•Dowolny wykonawca algorytmu (w szczególności komputer)
Sprzęt
Język opisu algory-
tmu
Schemat przetwa-
rzania Operacje
składowe algory-
tmu
Obiekty
wejściowe Algorytm Obiekty wyjściowe
•22 dag twardej czekolady półsłodkiej, 2 łyżki wody, 1/4 filiżanki cukru pudru, 6 jajek, . . . .
Dane wejściowe
•bity krem czekoladowy (kuchnia francuska)
Dane wyjściowe
•Włóż czekoladę z dwiema łyżkami wody do garnka o podwójnym dnie. Kiedy czekolada się rozpuści domieszaj cukier puder; dodaj po trochu masło. Odstaw. Ubijaj żółtka około 5 minut, aż staną się gęste i nabiorą koloru
cytrynowego. Delikatnie dołóż czekoladę. Ponownie lekko podgrzej, aby rozpuścić czekoladę, jeśli to będzie
konieczne. Domieszaj rum i wanilię. Ubijaj białka aż do spienienia. Ubijając dodaj dwie łyżki cukru i ubijaj dalej, aż utworzą się sztywne pagórki. Delikatnie połącz białka z masą czekoladowo-żółtkową. Wylej do oddzielnych naczyń, które będą podane na stół. Ochładzaj przez co najmniej 4 godziny. Wedle życzenia, podawaj z bitą śmietaną. Wyjdzie z tego 6 do 8 porcji.
Opis
algorytmu
•1 kg świeżych węgierek , 10 dag suszonych śliwek bez pestek, 3 dag rodzynków, laska wanilii, 50 dag cukru, po pół litra spirytusu i wódki
Dane wejściowe
•śliwowica (kuchnia polska)
Dane wyjściowe
•Owoce umyć, osuszyć, wypestkować (1/10 zostawić) i wraz z umytymi rodzynkami, suszonymi śliwkami i odłożonymi pestkami włożyć do słoja. Zasypać owoce cukrem, a gdy puszczą sok, zalać spirytusem i odstawić na 3 tygodnie. Od czasu do czasu potrząsać słojem. Zlać alkohol do pustego słoja, zamknąć i odstawić. Do naczynia z owocami wlać wódkę, włożyć wanilię, zamknąć go i odstawić. Po 2 tygodniach zlać nalew, osączając owoce. Wymieszać oba nalewy, starannie przefiltrować, rozlać do butelek,
zakorkować i odstawić na 6 miesięcy w zaciemnione chłodne miejsce.
Opis
algorytmu
Podstawowe koncepcje algorytmiczne:
sekwencje czynności
warunkowe wykonanie
powtarzanie, aż zajdzie warunek
zestawy czynności zdefiniowane wcześniej – poziom szczegółowości
CZAS!
•a, b – liczby naturalne większe od 1
Dane wejściowe
•c=NWD(a,b)
Dane wyjściowe
•Wypisz czynniki pierwsze liczby a, powstaje lista A={a1,a2,...,an} (mogą wystąpić powtórzenia)
•Wypisz czynniki pierwsze liczby b, powstaje lista B={b1,b2,...,bm} (mogą wystąpić powtórzenia)
•Utwórz C jako listę wspólnych elementów list A i B (też z ewentualnymi powtórzeniami)
•Oblicz c jako iloczyn wszystkich elementów z C (jeśli C jest pusta to c=1)
•Wypisz c i zatrzymaj się.
Opis
algorytmu
Widać, jak algorytm działa dla małych liczb. Dla dużych:
Jak znajdować dzielniki?
Jak obliczać część wspólną list?
Rozwiązanie problemu: Algorytm Euklidesa –
ćw.
•lista ankiet osobowych (nazwisko, płaca, inne)
Dane wejściowe
•suma zarobków wszystkich osób
Dane wyjściowe
•zanotuj “na boku” liczbę 0
•przewertuj kolejno ankiety dodając zarobki każdej osoby do liczby “na boku”
•kiedy osiągniesz koniec listy przedstaw wartość liczby “na boku” jako wynik
Opis
algorytmu
Ważna cecha przykładu:
Wielkość programu taka sama dla dowolnie
długich list
Problem zatrzymania – algorytm ma orzekać, czy dany program komputerowy kiedykolwiek wykona wszystkie procedury i
zatrzyma się
•Program komputerowy
•Dane wejściowe dla tego programu
Dane wejściowe
•Odpowiedź „TAK” (program zatrzyma się po wykonaniu wszystkich zawartych w nim poleceń)
•Lub odpowiedź „NIE” (program nie zatrzyma się)
Dane wyjściowe
•Nie istnieje algorytm, który w
skończonym czasie orzeknie, czy
dany program dla określonych danych wejściowych zapętli się czy nie.
Rozwiązanie
IV w. p.n.e. Euklides: znajdowanie największego wspólnego dzielnika
VIII/IX w. n.e.: Muhammed Alchwarizmi:
dodawanie, odejmowanie, mnożenie,
dzielenie liczb dziesiętnych (Algorismus – nazwisko po łacinie)
1822 Charles Babbage: projekt “maszyny
różnicowej”, mechaniczny kalkulator (budowa
niedokończona)
1849 Babbage: maszyna analityczna - projekt
mechanicznego komputera, sterowanego kartami Jacquarda (zrealizowany ostatecznie w 1991 w
Science Museum, Londyn), czyli maszyny wykonującej dowolne programy
1850 Ada Augusta hrabina Lovelace: programy dla maszyny analitycznej Babbage’a
1930-te – Alan Turing, Kurt Goedel, Emil Post,
Alonzo Church, Stephen Kleene, Andriej Markow : teoria algorytmów, możliwości i ograniczenia
algorytmiki
1937 – maszyna MARK 1 – pierwsza działająca maszyna ze sterowaniem sekwencyjnym
(przekaźniki elektromagnetyczne), sterowana za pomocą taśmy papierowej, 200 op./sek.
1946 – Maszyna Einiac –pierwsza maszyna elektroniczna (lampy elektronowe) – 6 tys.
op./sek.
1958 – maszyny tranzystorowe, 20 tys.
op./sek.
1964 – maszyny mikroukładowe (układy scalone), 100 tys. op/sek
1970 – maszyny na zintegrowanych elementach scalonych, 10 mln. op/sek
1970-te do dzisiaj: rozkwit algorytmiki
Uniwersalne urządzenie do wykonywania algorytmów związanych z przetwarzaniem informacji
Komputer = sprzęt + oprogramowanie
Obiekty przetwarzane przez program: Dane
Dane +algorytm = wyniki
Zapis algorytmu zrozumiały dla komputera w
Języku programowania – U nas C++
Algorytmy zrozumiałe dla komputera :
Programy
Dział informatyki teoretycznej zajmujący się poszukiwaniem najlepszych i najbardziej
efektywnych algorytmów do zadań komputerowych.
Efektywny algorytm:
Najszybszy?
Wymagający najmniejszych zasobów pamięci?
Prostota algorytmu?
To zależy m.in. od przeznaczenia i oczekiwań
użytkowników.
Zasoby
potrzebne do wykonania
algorytmu Inne
Szerokość kanału komunikacyj-
nego
Pamięć Czas
działania
Nie możemy precyzyjnie przewidzieć ilości zasobów – zbyt dużo zmiennych czynników.
Wyodrębniamy główne parametry i poddajemy je analizie.
Pomijamy wiele szczegółów – analiza jest przybliżona.
Cel osiągamy – obiektywne porównanie różnych algorytmów
rozwiązania tego samego problemu i wybranie najlepszego.
Badamy problem
Czy możliwe jest rozwiązanie go na komputerze w skończonym i możliwym do zaakceptowania czasie
Czy już istnieje algorytm rozwiązujący problem
Czy mamy jeszcze czego szukać, czy już mamy algorytm optymalny
Jeśli nie, to pracujemy nad lepszym rozwiązaniem
Pytanie: Czy algorytm przez nas zaproponowany jest poprawny?
Poprawny jest, gdy:
Dla każdego zestawu danych wejściowych zatrzymuje się i daje dobry wynik.
Poprawność dokładniej zostanie omówiona na oddzielnym wykładzie.
Intuicja
Złożoność obliczeniowa – podstawowa wielkość stanowiąca miarę przydatności algorytmu.
Obejmuje problemy związane z implementacją i
efektywnością algorytmu.
Złożoność obliczeniowa – funkcja zależna od danych
wejściowych, a dokładnie od rozmiaru danych wejściowych.
Rozmiar danych wejściowych – liczba pojedynczych danych wchodzących w skład całego zestawu danych wejściowych.
Przykład:
Problem Rozmiar danych wejściowych
Wyznaczenie wartości wielomianu w punkcie Stopień wielomianu Wyznaczenie n-tej potęgi liczby rzeczywistej Wykładnik potęgi
Mnożenie dwóch liczb całkowitych Całkowita liczba bitów potrzebnych do reprezentacji tych liczb w postaci binarnej Sortowanie ciągu elementów Liczba wyrazów ciągu
Zagadnienie przechodzenia przez drzewo Liczba węzłów drzewa
Złożoność obliczeniowa
algorytmu
Złożoność pamięciowa P(n) –
pamięć, przestrzeń.
(Jaka ilość zasobów pamięci potrzebna jest do realizacji – liczba i rodzaj zmiennych,
rodzaj danych)
Złożoność czasowa T(n)- czas.
(Zależy od liczby operacji wykonanych podczas działania
algorytmu)
Zależność odwrotnieproporcjonalna
Miara szybkości algorytmu powinna być:
Niezależna od oprogramowania
Niezależna od sprzętu
Niezależna od umiejętności programisty
Powinna to być cecha samego algorytmu!
Problem Operacje dominujące Wyznaczenie wartości wielomianu
w danym punkcie Operacje arytmetyczne
Sortowanie Porównanie elementów ciągu
wejściowego (czasem także przestawienie elementów ciągu) Przeglądanie drzewa Przejście między węzłami w
drzewie
Liczbę operacji dominujących zwykle szacujemy z dokładnością do stałego czynnika.
Dla małych rozmiarów danych wejściowych najlepsze są najprostsze rozwiązania – nie ma problemu.
Jak zachowuje się algorytm, gdy rozmiar danych wejściowych dąży do nieskończoności?
Podajemy najprostszą funkcję charakteryzującą rząd wielkości T(n). Np.:
T(n)=n
2dla 2n
2+50, T(n)=n dla 100n
W pierwszym przypadku algorytm jest wolniejszy, bo dla „dużego” n funkcja kwadratowa rośnie szybciej niż liniowa.