Algorytmika
description
Transcript of Algorytmika
Algorytmika
Skąd wziąć przepis na sukces (w programowaniu)?
Czyli: dlaczego warto planować poszczególne etapy rozwiązywania zadania programistycznego?
Algorytmika
Algorytmika
• Składniki
• Garnki, miski, talerze, piekarnik,…
• Osoba przygotowująca
• PRZEPIS
• Efekt: potrawa
Przykład z życia: proces przygotowania potrawy
Algorytmika
• Dane wejściowe
• oprogramowanie
• Komputer
• ALGORYTM
• Wynik
proces numerycznego rozwiązywania zadania
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
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
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)
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)
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)
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)
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)
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)
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)
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)
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)
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.
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.
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.
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)
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)
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”)
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
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ć
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)
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)
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
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.
Algorytmika
Zadanie algorytmiczne a algorytm(1)
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.
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!
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
…
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ę.
Algorytmika
Przykłady zadań algorytmicznych
Dane: poprawna sytuacja szachowa; wynik: ruch dający największą szansę na
wygranie
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)
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ść.
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, …
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.
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.
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?
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)
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
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, …
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ń
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)
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.
Algorytmy i dane
Sortowanie (5)
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)
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ń
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.