Post on 28-Feb-2019
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 instalacyjnych
napisanych 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
algorytmachPodstawowe narzędzia
matematyczne
Poprawność
algorytmów
Złożoność obliczeniowa i
pamięciowa
Algorytmy
rekurencyjne
Wybrane algorytmy
sortowania
Struktury danychAlgorytmy
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ścioweAlgorytm
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ódkiDane 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 1Dane 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óbDane 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
Problem zatrzymania – algorytm ma orzekać, czy dany program komputerowy kiedykolwiek wykona wszystkie procedury i
zatrzyma się
•Program komputerowy
•Dane wejściowe dla tego programuDane 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ść odwrotnie proporcjonalna
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)=n2 dla 2n2+50, T(n)=n dla 100n
W pierwszym przypadku algorytm jest wolniejszy, bo dla „dużego” n funkcja kwadratowa rośnie szybciej niż liniowa.
Asymptotyczny czas działania – czas działania algorytmu dla danych wejściowych, których rozmiar dąży do nieskończoności.
Większość algorytmów ma złożoność czasową (asymptotyczny czas
działania) proporcjonalną do jednej z podanych poniżej funkcji:
Przykład. Tabelka przedstawiająca czas potrzebny do realizacji
algorytmu, który wykonuje 2n operacji dominujących (dla danych wejściowych rozmiaru n) przez dwa komputery, przy założeniu, że jedna operacja na każdym z nich zajmuje odpowiednio 10-6 i 10-9 sekund.
Mając algorytm, pytamy, czy możemy szybciej osiągnąć cel, czy też złożoność czasowa już osiągnęła wartość najmniejszą z możliwych.
Zakres (przedział) czasów działania – przedział między teoretycznym dolnym oszacowaniem a najlepszym znanym algorytmem
Algorytmy sortowania oparte na porównywaniu elementów mają teoretyczne dolne oszacowanie liczby operacji dominujących rzędu nlgn, a trywialne dolne oszacowanie rzędu n.
Problem mnożenia dwóch macierzy wymiaru n x n ma trywialne dolne oszacowanie rzędu kwadratowego.