Algorytmika

50
Algorytmika Skąd wziąć przepis na sukces (w programowaniu)? Czyli: dlaczego warto planować poszczególne etapy rozwiązywania zadania programistycznego?

description

Algorytmika. Skąd wziąć przepis na sukces (w programowaniu)? Czyli: dlaczego warto planować poszczególne etapy rozwiązywania zadania programistycznego?. Algorytmika. Algorytmika. Przykład z życia: proces przygotowania potrawy. Składniki Garnki, miski, talerze, piekarnik,… - PowerPoint PPT Presentation

Transcript of Algorytmika

Page 1: Algorytmika

Algorytmika

Skąd wziąć przepis na sukces (w programowaniu)?

Czyli: dlaczego warto planować poszczególne etapy rozwiązywania zadania programistycznego?

Page 2: Algorytmika

Algorytmika

Page 3: Algorytmika

Algorytmika

• Składniki

• Garnki, miski, talerze, piekarnik,…

• Osoba przygotowująca

• PRZEPIS

• Efekt: potrawa

Przykład z życia: proces przygotowania potrawy

Page 4: Algorytmika

Algorytmika

• Dane wejściowe

• oprogramowanie

• Komputer

• ALGORYTM

• Wynik

proces numerycznego rozwiązywania zadania

Page 5: Algorytmika

Algorytmika

• Składniki

• Garnki, miski, piekarnik,…

• Osoba przygotowująca

• PRZEPIS

• Efekt: potrawa

Przygotowanie potrawy a numeryczne rozwiązywanie zadania

• Dane wejściowe

• oprogramowanie

• Komputer

• ALGORYTM

• Wynik

Page 6: Algorytmika

Algorytmika

Algorytm – zbiór czynności składających się na dany

proces.

Algorytmika – obszar ludzkich dociekań, wiedzy i

doświadczeń dotyczących algorytmów. Dotyczy nie

tylko informatyki, ale bez rozwoju informatyki nie

byłoby rozwoju algorytmiki. Ważna w kontekście tych

dziedzin nauki, które czerpią korzyści z posługiwania

się komputerami (ale nie tylko).

Definicje

Page 7: Algorytmika

Algorytmika

IV w. p.n.e., Euklides:

znajdowanie największego

wspólnego dzielnika liczb

naturalnych. Pomysł

Euklidesa traktowany jest

jako pierwszy algorytm

Historia algorytmiki: algorytm Euklidesa (1)

Page 8: Algorytmika

Algorytmika

Algorytm Euklidesa: największy wspólny dzielnik dwóch liczb.

1. Są dwie różne liczby: n1 i n2, od większej odejmujemy

mniejszą, dostajemy n3

2. Są dwie liczby n3 i mniejsza spośród n1 i n2, od większej

odejmujemy mniejszą, dostajemy n4

3. …

4. Powtarzamy czynności, aż otrzymana różnica będzie równa

mniejszej z aktualnie rozpatrywanej pary liczb; otrzymana

liczba jest największym wspólnym dzielnikiem n1 i n2

Historia algorytmiki: algorytm Euklidesa (2)

Page 9: Algorytmika

Algorytmika

Algorytm Euklidesa: największy wspólny dzielnik 221 i 286

1. Mamy 221 i 286, różnica: 65

2. Mamy 221 i 65, różnica: 156

3. Mamy 156 i 65, różnica: 91

4. Mamy 91 i 65, różnica: 26

5. Mamy 65 i 26, różnica: 39

6. Mamy 39 i 26, różnica: 13

7. Mamy 26 i 13, różnica: 13 – NWD 221 i 286

Historia algorytmiki: algorytm Euklidesa (3)

Page 10: Algorytmika

Algorytmika

IX w. n.e., reguły dodawania, odejmowania, mnożenia i

dzielenia liczb dziesiętnych, od jego nazwiska pochodzi

słowo algorytm; wielki wpływ na naukę europejską

Historia algorytmiki: Muhammed Alchwarizmi (łac. Algorismus)

Page 11: Algorytmika

Algorytmika

1801 r. Joseph Jacquard:

krosno tkackie, wzór

tkaniny sterowany był

„dziurkowanymi kartami”

(mechanizm

rozpoznawał otwory,

kierowanie pracą

maszyny)

Historia algorytmiki: XIX w. (1)

Page 12: Algorytmika

Algorytmika

1833 r. Charles Babbage,

„maszyna różnicowa”

(obliczanie niektórych wzorów

matematycznych, tablicowanie

wielomianów – dotąd

wykonywane „ręcznie”),

nieukończona. Zbudowana w

Londyńskim Muzeum Nauki,

1990 r., dokładność: 31 cyfr

Historia algorytmiki: XIX w. (2)

Page 13: Algorytmika

Algorytmika

Ok.1840 - 70 r. Charles

Babbage, pomysł

„maszyny analitycznej”,

wykonywanie algorytmów

zapisanych w

„programach”

zakodowanych w

dziurkowanych kartach.

Nieukończona

Historia algorytmiki: XIX w. (3)

Page 14: Algorytmika

Algorytmika

Maszyna analityczna:

• Napęd: silnik parowy

• Rozdzielenie pamięci i

jednostki obliczeniowej

• Wyniki – drukarka,

urządzenie kreślarskie, karty

dziurkowane

• Pętle, instrukcje warunkowe,

przetwarzanie równoległe

Historia algorytmiki: XIX w. (4)

Page 15: Algorytmika

Algorytmika

Współpracownica Charlesa

Babbage’a: Ada Lovelace

– „pierwsza programistka”,

pisała „programy” na

maszynę analityczną

Problemy: brak finansów,

konieczność precyzyjnego

wykonania elementów

Koncepcje Babbage’a

zrealizowano w wieku XX

Historia algorytmiki: XIX w. (5)

Page 16: Algorytmika

Algorytmika

Koniec XIX w. Herman

Hollerith, elektryczna

maszyna analityczno –

licząca, karty dziurkowane,

trzykrotne przyspieszenie

obróbki danych ze spisu

powszechnego (USA,

1890r.), od firmy Holleritha

rozwinęło się IBM

Historia algorytmiki: XIX i XX w.

Page 17: Algorytmika

Algorytmika

I połowa XX w.: rozwój formalizmu matematycznego, logika

matematyczna, prace nad teorią algorytmów, zrozumienie

możliwości i ograniczeń algorytmów sterujących pracą

maszyn, Alan Turing, Kurt Goedel, Andriej Markow, John von

Neumann, …

Algorytmika rozwijała się już przed erą komputerów

Historia algorytmiki: XIX i XX w.

Page 18: Algorytmika

Algorytmika

Lata 40 – te XX w. pierwsze komputery

Lata 50 – te i później: szybkie postępy w projektowaniu i budowie

komputerów.

Algorytmy w kontekście informatyki:

• zdefiniowanie sposobu rozwiązywania konkretnego

problemu (np. jakieś zagadnienie fizyki), komputer –

narzędzie do realizacji algorytmu

• sterowanie pracą komputera, algorytm – narzędzie

umożliwiające funkcjonowanie komputera

Rozwój algorytmiki i informatyki – ściśle powiązane

Historia algorytmiki: XX w.

Page 19: Algorytmika

Algorytmika

Page 20: Algorytmika

Algorytmika

• jak duża puszka?

• Jak duża papryka?

• Co to znaczy „garść”?

• Jak duża łyżka?

• Jakiego oleju?

• Ile soli?

• Ile pieprzu?

Poziom szczegółowości (1)

Page 21: Algorytmika

Algorytmika

• W jaki sposób umyć?

• Małe kawałki?

• Podsmaż delikatnie?

• Odrobina oleju?

• Średniej wielkości?

• Pestki papryki też kroić?

Poziom szczegółowości (2)

Page 22: Algorytmika

Algorytmika

Poziom szczegółowości (3)

• Przeciętny człowiek wie, jak interpretować informacje

zwarte w przepisie, są one wystarczające

• „kulinarnemu nowicjuszowi” trzeba dokładnie wytłumaczyć,

np. co to jest patelnia, jak usmażyć, żeby nie przypalić, ale

żeby nie było surowe itd.

• Doświadczonemu kucharzowi wystarczy podać listę

najważniejszych składników („mądrej głowie dość dwie

słowie”)

Page 23: Algorytmika

Algorytmika

Poziom szczegółowości (4)

Mnożenie dwóch liczb, np. 123 * 45 = ?

• Pomnóż 5 przez 3, zapisz 5, zapamiętaj 1

• Pomnóż 5 przez 2, dodaj 1, zapisz z przodu 1, zapamiętaj 1

• Pomnóż 5 przez 1, dodaj 1, zapisz z przodu 6, masz liczbę 615

• Pomnóż 4 przez 3, zapisz 2, zapamiętaj 1

• Pomnóż 4 przez 2, dodaj 1, zapisz z przodu 9

• Pomnóż 4 przez 1, zapisz z przodu 4, dopisz z tyłu 0, masz 4920

• Dodaj 615 i 4920, dostajesz 5535

Page 24: Algorytmika

Algorytmika

Poziom szczegółowości (5)

Mnożenie dwóch liczb, np. 123 * 45 = ?

• Przeciętny człowiek wykona te obliczenia na kartce w ciągu,

powiedzmy, 2 minut

• Drugoklasista może nie znać tabliczki mnożenia, trzeba mu

wytłumaczyć, że 5 * 3 = 5 + 5 + 5 (ale czy umie sprawnie

dodawać?)

• Osoba „pracująca na liczbach” wykona takie mnożenie w

pamięci w kilka sekund, nie trzeba jej niczego tłumaczyć

Page 25: Algorytmika

Algorytmika

Poziom szczegółowości (6)

Celem jest jasny i jednoznaczny algorytm

• Różni ludzie mogą wymagać różnego poziomu

szczegółowości

• Nie można zanadto zagłębiać się w opisie szczegółów

• Zawsze potrzebny jest „zestaw akcji podstawowych”

(delikatne podsmażenie, pokrojenie w małe kawałki;

mnożenie cyfr, dodawanie liczb)

Page 26: Algorytmika

Algorytmika

Poziom szczegółowości (7) – komputer

Celem jest jasny i jednoznaczny algorytm

• Komputery mogą jedynie wykonywać skrajnie proste działania

na skrajnie prostych elementach

• potrafią dodawać i mnożyć liczby, ale nie mnożą macierzy –

możemy im to opisać poprzez operacje dodawania i mnożenia liczb;

możemy ewentualnie stworzyć nową „akcję podstawową” – funkcję

do mnożenia macierzy

• Mogą wykonywać bardzo skomplikowane i złożone zadania, o ile

będą one przetłumaczone na najprostsze operacje (na bitach)

Page 27: Algorytmika

Algorytmika

Krótkie algorytmy a długotrwałość procesów

Mamy w danej firmie informacje o wszystkich pracownikach, w

tym: wysokość zarobków. Interesuje nas suma zarobków

wszystkich pracowników.

1. Wprowadzamy zmienną suma i ją zerujemy

2. Przewertuj jednego po drugim wszystkich pracowników,

zarobki każdego dodawaj do wartości zmiennej suma

3. Gdy przewertujesz wszystkich, przedstaw wartość zmiennej

suma jako wynik

Page 28: Algorytmika

Algorytmika

Krótkie algorytmy a długotrwałość procesów

pracownicy zarobki Suma (na wejściu = 0)

Pracownik 1 20000 20000

Pracownik 2 30000 50000

Pracownik 3 15000 65000

Pracownik N 25000 5435000 wynik

Niezależnie od wielkości zatrudnienia algorytm jest ten sam, liczba

„narzędzi” (zmiennych) jest ta sama. Różny będzie czas wykonania.

Wymagania: poprawnie podana lista płac (konkretny format).

Algorytm jest uniwersalny dla nieskończonej liczby list płac.

Page 29: Algorytmika

Algorytmika

Zadanie algorytmiczne a algorytm(1)

Page 30: Algorytmika

Algorytmika

Zadanie algorytmiczne a algorytm(2)

Algorytm – rozwiązanie zadania algorytmicznego.

Przykład zadania algorytmicznego: na podstawie listy płac o dowolnej

długości, zorganizowanej w konkretny sposób, mamy wyznaczyć

pewną liczbę – sumę zarobków

• znamy: dokładny format dopuszczalnych danych wejściowych

• szukamy: pewnej liczby zależnej od danych wejściowych

(wiemy, jaka jest ta zależność)

Zadanie algorytmiczne jest rozwiązane, gdy zostaje znaleziony

odpowiedni algorytm.

Page 31: Algorytmika

Algorytmika

Zadanie algorytmiczne a algorytm(3)

W zadaniu algorytmicznym chodzi o znalezienie metody, która na

podstawie dowolnych informacji wejściowych (w

dopuszczalnym formacie) prowadzi do pewnego wyniku

będącego znaną funkcją danych wejściowych.

Chodzi o metodę, a nie o sam wynik!

Page 32: Algorytmika

Algorytmika

Zadanie algorytmiczne a algorytm(4)

Format informacji wejściowych – określony w danych zadania

algorytmicznego.

Co robić, gdy informacje wejściowe są podane według żądanego

formatu, ale są „nietypowe”? Np. ujemne wartości zarobków przy

niektórych nazwiskach na liście płac (ew. zero lub puste miejsce)

pracownicy zarobki

Pracownik 1 20000

Pracownik 2

Pracownik 3 -1000

Page 33: Algorytmika

Algorytmika

Zadanie algorytmiczne a algorytm(5)

Za odpowiednie traktowanie danych odpowiada algorytm. Musi on

zidentyfikować dane nietypowe.

pracownicy zarobki

Pracownik 1 20000

Pracownik 2

Pracownik 3 -1000

Na podstawie „danych nietypowych” można stworzyć listę pozycji, które

zostaną odesłane do zweryfikowania przez dział płac.

W „dobrym” algorytmie należy przewidzieć taką sytuację.

Page 34: Algorytmika

Algorytmika

Przykłady zadań algorytmicznych

Dane: poprawna sytuacja szachowa; wynik: ruch dający największą szansę na

wygranie

Page 35: Algorytmika

Algorytmika

Przykłady zadań algorytmicznych

Dane: odległości pomiędzy miastami; wynik: najkrótsza trasa (każde miasto

tylko raz, oszczędność paliwa, czasu pracy itd)

Page 36: Algorytmika

Algorytmy i dane

Struktury sterujące (1)

• Procesor (lub ogólnie wykonawca) może wykonywać pewne

akcje podstawowe.

• Instrukcje elementarne – zlecenia wykonania akcji

podstawowych (jasne, jednoznaczne).

• Organizacja kolejności wykonywania akcji.

Algorytm musi zawierać instrukcje sterujące określające kolejność.

Page 37: Algorytmika

Algorytmy i dane

Struktury sterujące (2)

Struktury sterujące (struktury przepływu sterowania) – układy instrukcji

ustalające kolejność.

Typowe struktury sterujące:

• Bezpośrednie następstwo (w C++ kolejne instrukcje rozdzielane

średnikami): wykonaj A, [potem] wykonaj B, …

Page 38: Algorytmika

Algorytmy i dane

Struktury sterujące (3)

Typowe struktury sterujące, cd:

• Wybór warunkowy, rozgałęzienie warunkowe (if - else): „jeśli Q

to wykonaj A, w przeciwnym razie wykonaj B (albo nie rób nic)”,

Q – warunek logiczny

Jeśli uważasz, że potrawa jest za mało słona, dodaj szczyptę soli.

Uwaga:

Algorytm zawierający tylko następstwo i wybór może opisywać procesy nie

dłuższe od pewnej ustalonej wielkości, ponieważ żaden jego fragment nie

jest nigdy wykonywany więcej niż jeden raz.

Page 39: Algorytmika

Algorytmy i dane

Struktury sterujące (4)

Typowe struktury sterujące, cd:

• Iteracje – zwroty pętlące

o Iteracja ograniczona (for) „wykonaj A dokładnie N razy”

o Iteracja warunkowa (while, do – while) „wykonuj A aż do Q”

lub „dopóki Q wykonuj A”, Q – warunek logiczny

Ubijaj białka aż do spienienia.

Ser należy zmielić trzykrotnie.

Krótki opis może reprezentować bardzo długi proces.

Page 40: Algorytmika

Algorytmy i dane

Struktury sterujące (5)

Mamy w danej firmie informacje o wszystkich pracownikach, w tym:

wysokość zarobków. Interesuje nas suma zarobków wszystkich

pracowników.

1. Wprowadzamy zmienną suma i ją zerujemy

2. Przewertuj jednego po drugim wszystkich pracowników, zarobki

każdego dodawaj do wartości zmiennej suma

3. Gdy przewertujesz wszystkich, przedstaw wartość zmiennej suma

jako wynik

Jak to zapisać za pomocą struktur sterujących?

Page 41: Algorytmika

Algorytmy i dane

Struktury sterujące (6)

Założenie: dane wejściowe to lista płac oraz liczba N – liczba

pracowników (długość listy płac)

1. Wprowadź zmienną suma i ją wyzeruj; przejdź do pierwszej płacy z listy;

2. N-1 razy wykonaj:

• Dodaj aktualną płacę do zmiennej suma;

• Przejdź do następnej płacy;

3. Dodaj aktualną płacę do zmiennej suma;

4. Podaj wartość zmiennej suma jako wynik;

Użycie następstwa i iteracji ograniczonej. Jeśli nie znalibyśmy N,

użylibyśmy iteracji warunkowej (sprawdzanie, czy już koniec listy)

Page 42: Algorytmika

Algorytmy i dane

Struktury sterujące (7)

Składanie struktur sterujących

• Wiele kombinacji: następstwo, wybór i iteracje mogą być przeplatane i

zagnieżdżane w sobie

• Iteracje zagnieżdżone (pętle zagnieżdżone): w każdej iteracji pętli

zewnętrznej wykonaj pętlę wewnętrzną

• Przykład: wczytywanie tablicy 2-wymiarowa (macierzy) – odczytywanie

kolejnych wierszy (w każdym wierszu przechodzimy przez wszystkie

kolumny)

NNNN

N

N

aaa

aaa

aaa

A

,2,1,

,22,21,2

,12,11,1

Zagnieżdżanie pętli –

krótki zapis dla dużej

ilości operacji

Page 43: Algorytmika

Algorytmy i dane

Sortowanie (1)

Sortowanie danych – jedno z najczęściej pojawiających się zadań.

Dane: tablica liczb [ 4, 10, 5, 3, 8 ]

Wynik: tablica z liczbami posortowanymi niemalejąco [ 3, 4, 5, 8, 10 ]

Zadanie algorytmiczne: mając dowolnie długą tablicę liczb uzyskaj

tablicę liczb posortowanych niemalejąco

Algorytmy sortowania: wybór, wstawianie, bąbelkowe, …

Page 44: Algorytmika

Algorytmy i dane

Sortowanie (2)

Sortowanie przez wybór

1. Startuję od elementu 1, szukam elementu najmniejszego, zamieniam go z

elementem 1: [ 4, 10, 5, 3, 8 ] [ 3, 10, 5, 4, 8 ] (4 porównania)

2. Startuję od elementu 2, szukam elementu najmniejszego, zamieniam go z

elementem 2: [ 3, 10, 5, 4, 8 ] [ 3, 4, 5, 10, 8 ] (3 porównania)

3. Startuję od elementu 3, szukam elementu najmniejszego, zamieniam go z

elementem 3: [ 3, 4, 5, 10, 8 ] [ 3, 4, 5, 10, 8 ] (2 porównania)

4. Startuję od elementu 4, szukam elementu najmniejszego, zamieniam go z

elementem 4: [ 3, 4, 5, 10, 8 ] [ 3, 4, 5, 8, 10 ] (1 porównanie)

Szukanie najmniejszego elementu – przez porównywanie wartości na aktualnie

badanej pozycji z wartościami na kolejnych pozycjach; tu 10 porównań

Page 45: Algorytmika

Algorytmy i dane

Sortowanie (3)

Sortowanie przez wybór: dla N liczb, tablica T

Dla i równych od 1 do N-1

• Pomocnicza zmienna a = T[i], b=0

• Dla j równych od i+1 do N

o Jeśli T[j]<a, to a=T[j], b=j

• Jeśli b>0, to zamień T[i] z T [j] (potrzebna jeszcze jedna zmienna)

Liczba porównań (N-1) + (N-2) + … + 2 + 1 = N * ( N – 1 ) / 2

Złożoność algorytmu sortowania przez wybór: O (N2)

Page 46: Algorytmika

Algorytmy i dane

Sortowanie (4)

Sortowanie przez wstawianie

1. Tworzę nową (pustą) tablicę [ ], 1 element danej tablicy umieszczam w nowej

tablicy [ 4, 10, 5, 3, 8 ]; [ ] [ 4 ];

2. element 2 danej tablicy umieszczam w nowej tablicy przed lub za tamtejszym

elementem [ 4, 10, 5, 3, 8 ]; [ 4 ] [ 4, 10 ]; 1 por.

3. element 3 danej tablicy umieszczam w nowej tablicy przed, pomiędzy lub za

tamtejszymi elementami [ 4, 10, 5, 3, 8 ]; [ 4, 10 ] [ 4, 5, 10 ]; 2 por.

4. element 4 danej tablicy umieszczam w nowej tablicy przed, pomiędzy lub za

tamtejszymi elementami [ 4, 10, 5, 3, 8 ]; [ 4, 5, 10 ] [ 3, 4, 5, 10 ]; 1 por.

5. element 5 danej tablicy umieszczam w nowej tablicy przed, pomiędzy lub za

tamtejszymi elementami [ 4, 10, 5, 3, 8 ]; [ 3, 4, 5, 10 ] [ 3, 4, 5, 8, 10 ]; 4 por.

Kolejne elementy danej tablicy porównuję z elementami już umieszczonymi w

nowej tablicy, tu 8 porównań, ale maksymalnie może być 10.

Page 47: Algorytmika

Algorytmy i dane

Sortowanie (5)

Page 48: Algorytmika

Algorytmy i dane

Sortowanie (6)

Sortowanie przez wstawianie: dla N liczb:

• Maksymalna liczba porównań 1 + 2 + … + (N-2) + (N-1) = N * ( N – 1 ) / 2

• Złożoność algorytmu sortowania przez wstawianie: O (N2)

• Minimalna liczba porównań – dla każdego i od 2 do N tylko 1 porównanie, razem (N-

1) - jeśli tablica wejściowa jest posortowana malejąco

• Zamiast z tablicy wejściowej brać elementy od pierwszego do ostatniego, można

brać od ostatniego do pierwszego (lub w dowolnym innym porządku)

• W podanym ujęciu – potrzebne są dwie tablice (wejściowa i wyjściowa)

Page 49: Algorytmika

Algorytmy i dane

Sortowanie (7)

Sortowanie bąbelkowe

1. porównuję parami kolejne elementy, jeśli następny jest mniejszy od poprzedniego,

zamieniam ich kolejność:

[ 4, 10, 5, 3, 8 ] [ 4, 10, 5, 3, 8 ] [ 4, 5, 10, 3, 8 ] [ 4, 5, 3, 10, 8 ]

[ 4, 5, 3, 8, 10 ] (4 porównania)

2. porównuję parami kolejne elementy bez ostatniego

[ 4, 5, 3, 8, 10 ] [ 4, 3, 5, 8, 10 ] (3 porównania)

3. porównuję parami kolejne elementy bez 2 ostatnich

[ 4, 3, 5, 8, 10 ] [ 3, 4, 5, 8, 10 ] (2 porównania)

4. porównuję parami kolejne elementy bez 3 ostatnich

[ 3, 4, 5, 8, 10 ] [ 3, 4, 5, 8, 10 ] (1 porównanie)

10 porównań

Page 50: Algorytmika

Algorytmy i dane

Sortowanie (8)

Sortowanie bąbelkowe: dla N liczb

Dla i równych od N do 2

• Dla j równych od 1 do i-1

o Jeśli T[j] > T[j+1] , to elementy zamieniamy miejscami

Liczba porównań (N-1) + (N-2) + … + 2 + 1 = N * ( N – 1 ) / 2

Złożoność algorytmu sortowania bąbelkowego: O (N2)

Możliwe usprawnienia?

Jeśli przy danym i nie ma już żadnych zamian, sortowanie jest zakończone.