42
Wioletta Karpińska Wydział Matematyki i Informatyki Uniwersytet Łódzki Zajęcia na DUM I w 2017

Wioletta Karpińska Wydział Matematyki i Informatyki ...karpinw/zadania/Aalgorytmow/Wyklad1.pdf · •22 dag twardej czekolady półsłodkiej, 2 łyżki wody, Dane wejściowe 1/4

Embed Size (px)

Citation preview

Wioletta KarpińskaWydział 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 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

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 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.

Dla niektórych ważnych problemów teoretyczne dolne oszacowanie nie zostało jeszcze wyznaczone.

W takim przypadku bierzemy pod uwagę najszybszy istniejący algorytm rozwiązujący dany problem.