Algorytmy i struktury danych

Podobne dokumenty
Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Algorytm. a programowanie -

1 Wprowadzenie do algorytmiki

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

WHILE (wyrażenie) instrukcja;

2.8. Algorytmy, schematy, programy

Podstawy Informatyki. Sprawność algorytmów

Warunki logiczne instrukcja if

Podstawy Programowania Algorytmy i programowanie

6. Pętle while. Przykłady

WHILE (wyrażenie) instrukcja;

Algorytm i złożoność obliczeniowa algorytmu

Algorytmy komputerowe. dr inŝ. Jarosław Forenc

Wprowadzenie do algorytmów

Programowanie dynamiczne

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

Podstawy programowania funkcjonalnego

Wprowadzenie do algorytmiki

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

TEORETYCZNE PODSTAWY INFORMATYKI

Podstawy programowania. Podstawy C# Przykłady algorytmów

Iteracje. Algorytm z iteracją to taki, w którym trzeba wielokrotnie powtarzać instrukcję, aby warunek został spełniony.

Zapis algorytmów: schematy blokowe i pseudokod 1

METODY OPISU ALGORYTMÓW KOMPUTEROWYCH

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Metody Metody, parametry, zwracanie wartości

Zasady analizy algorytmów

Zadanie 1. Potęgi (14 pkt)

TEORETYCZNE PODSTAWY INFORMATYKI

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Definicja algorytmu brzmi:

Programowanie - wykład 4

Lekcja : Tablice + pętle

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 7 Algorytmy

Zapisywanie algorytmów w języku programowania

Wstęp do programowania

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

WYRAŻENIA ALGEBRAICZNE

Jeszcze o algorytmach

Efektywność algorytmów

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Podstawy Programowania

Wstęp do Informatyki

Wykład 2. Poprawność algorytmów

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

TEORETYCZNE PODSTAWY INFORMATYKI

Podstawy i języki programowania

KONSPEKT ZAJĘĆ KOŁA INFORMATYCZNEGO LUB MATEMATYCZNEGO W KLASIE III GIMNAZJUM LUB I LICEUM ( 2 GODZ.)

Algorytmy i struktury danych. wykład 2

Materiały dla finalistów

3. Instrukcje warunkowe

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Wstęp do programowania

Definicje. Algorytm to:

a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]

1. Informatyka - dyscyplina naukowa i techniczna zajmująca się przetwarzaniem informacji.

Wskazówki dotyczące zmiennych, tablic i procedur 1

ZADANIE 1. Ważenie (14 pkt)

Teoretyczne podstawy informatyki

7. Pętle for. Przykłady

B jest globalnym pokryciem zbioru {d} wtedy i tylko wtedy, gdy {d} zależy od B i nie istnieje B T takie, że {d} zależy od B ;

Programowanie w VB Proste algorytmy sortowania

Wyszukiwanie binarne

Wstęp do informatyki- wykład 2

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 1. Karol Tarnowski A-1 p.

Algorytmy i struktury danych. Wykład 4

Analiza algorytmów zadania podstawowe

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Opis problemu i przedstawienie sposobu jego rozwiązania w postaci graficznej. Gimnazjum nr 3 im. Jana Pawła II w Hrubieszowie 1

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

Algorytmy w teorii liczb

Matematyczne Podstawy Informatyki

Pętle. Dodał Administrator niedziela, 14 marzec :27

5. Rekurencja. Przykłady

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

Piotr Chrząstowski-Wachtel Uniwersytet Warszawski. Al Chwarizmi i trzy algorytmy Euklidesa

Informacja o języku. Osadzanie skryptów. Instrukcje, komentarze, zmienne, typy, stałe. Operatory. Struktury kontrolne. Tablice.

Sztuczna Inteligencja Projekt

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Wprowadzenie do złożoności obliczeniowej

ZŁOŻONOŚĆ OBLICZENIOWA ALGORYTMÓW

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Technologie informacyjne Wykład VII-IX

Za pierwszy niebanalny algorytm uważa się algorytm Euklidesa wyszukiwanie NWD dwóch liczb (400 a 300 rok przed narodzeniem Chrystusa).

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Wykład IV Algorytmy metody prezentacji i zapisu Rzut oka na język PASCAL

ALGORYTMY I STRUKTURY DANYCH

Pzetestuj działanie pętli while i do...while na poniższym przykładzie:

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

Liczby losowe i pętla while w języku Python

Transkrypt:

Letnie Warsztaty Matematyczno-Informatyczne Algorytmy i struktury danych Mariusz Różycki University of Cambridge

Zajęcia będą mieć formę wykładową. Slajdy można znaleźć na stronie kursu: http://lw.mi.edu.pl/informatyka/algorytmy. Pomocne będzie pobieżne zapoznanie się z nimi przed zajęciami. Wersja zaanotowana będzie umieszczana po każdych zajęciach.

Po piątkowych zajęciach opublikowany zostanie test, który pozostanie otwarty do soboty do godziny 18.00. Na osoby, które poradzą sobie z nim najlepiej, czekają drobne nagrody.

Ciekawostka: w Anglii nadal można kupić w sklepach gwiazdki Milky Way. Tak tylko mówię.

Algorytmy i struktury danych Wprowadzenie Letnie Warsztaty Matematyczno-Informatyczne

Wprowadzenie Definicja algorytmu algorytm (ang. algorithm) w matematyce skończony ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego rodzaju zadań. Wikipedia

Wprowadzenie Algorytmy w codziennym życiu Przykładem algorytmu jest przepis kucharski. Przepis na naleśniki 1. Do miski wrzucić jajka, wsypać mąkę i wlać mleko. 2. Mieszać do uzyskania jednolitej masy. 3. Wlać porcję ciasta na rozgrzaną patelnię. 4. Gdy masa się zetnie, odwrócić naleśnik. 5. Zdjąć naleśnik z patelni. 6. Powtarzać do wyczerpania ciasta.

Wprowadzenie Sposoby zapisywania algorytmów lista kroków schemat blokowy język programowania pseudokod

Wprowadzenie Pseudokod Metoda pośrednia między językiem programowania a listą kroków. Posiada zalety obu rozwiązań: przejrzysty nawet dla skomplikowanych algorytmów wymaga dokładności przy zapisie nie wymaga znajomości detali implementacyjnych języków programowania łatwy do odczytania nawet dla osób nie potrafiących programować

Wprowadzenie Pseudokod Przypisanie i wartości: n 5 Liczba T [1, 2, 3] Lista R 1..5 Zakres (czyli lista), [1, 2, 3, 4], bez 5 T [1] n Teraz T = [1, 5, 3] Blok if: if warunek then zrób coś else zrób coś innego end if Jeżeli warunek jest spełniony wykonaj ten fragment kodu. W przeciwnym razie wykonaj ten fragment kodu.

Wprowadzenie Pseudokod Pętla for all: for all t T do zrób coś end for Pętla while: while warunek do zrób coś end while Dla każdego t należącego do T wykonaj ten fragment kodu. Dopóki warunek jest spełniony powtarzaj ten fragment kodu.

Wprowadzenie Pseudokod Procedura: procedure Sum(T ) Procedura Sum przyjmuje T. sum 0 Przypisz 0 do sum. for all t T do Dla każdego t sum sum + t zwiększ sum o t. end for return sum Zwróć wartość sum. end procedure

Wprowadzenie Znajdowanie minimum Spróbujmy zapisać przy użyciu pseudokodu jakiś prosty algorytm, jak znajdowanie minimum w ciągu liczb. Proste, prawda? Wystarczy spojrzeć na wszystkie liczby i wybrać najmniejszą.

Wprowadzenie Znajdowanie minimum Spróbujmy zapisać przy użyciu pseudokodu jakiś prosty algorytm, jak znajdowanie minimum w ciągu liczb. Proste, prawda? Wystarczy spojrzeć na wszystkie liczby i wybrać najmniejszą. Problem polega na tym, że komputer tak nie potrafi. Ty w sumie też nie, jeżeli liczb jest kilka tysięcy (a nawet milionów). Więc jak to zrobić?

Wprowadzenie Znajdowanie minimum Spróbujmy zapisać przy użyciu pseudokodu jakiś prosty algorytm, jak znajdowanie minimum w ciągu liczb. Proste, prawda? Wystarczy spojrzeć na wszystkie liczby i wybrać najmniejszą. Problem polega na tym, że komputer tak nie potrafi. Ty w sumie też nie, jeżeli liczb jest kilka tysięcy (a nawet milionów). Więc jak to zrobić? Musimy spojrzeć na każdą wartość w ciągu po kolei, zapamiętując wartość tej najmniejszej spośród dotychczas napotkanych.

Wprowadzenie Znajdowanie minimum procedure Minimum(T ) min Każda liczba jest mniejsza od. for all t T do if t < min then Jeżeli t jest mniejsze od min min t end if end for return min end procedure zmień dotychczasowe minimum. Zwróć najmniejszą napotkaną liczbę.

Wprowadzenie Algorytm Euklidesa Przykładem nieco mniej oczywistego algorytmu jest algorytm Euklidesa. Przy jego użyciu możemy znaleźć najmniejszy wspólny dzielnik dwóch liczb (ang. Greatest Common Divisor, w skrócie GCD). Mając dane dwie liczby odejmujemy od większej mniejszą, aż jedna z nich będzie równa 0. Wtedy druga z liczb będzie wynikiem algorytmu.

Wprowadzenie Algorytm Euklidesa procedure GCD(a, b) if a < b then Jeżeli a jest mniejsze od b Swap(a, b) zamień je miejscami. end if Teraz a będzie zawsze większe od b. while b > 0 do Dopóki b nie jest zerem c a b odejmuj b od a. a b Przy okazji zamień je miejscami, b c żeby a było nadal większe od b. end while return a b jest zerem, więc a jest wynikiem. end procedure

procedure GCD(a,b): while b > 0: if a < b then Swap(a,b) end if a <- a-b end while return a end procedure

Wprowadzenie Algorytm Euklidesa Algorytm Euklidesa można przyspieszyć, używając dzielenia modulo: procedure Fast-GCD(a, b) while b > 0 do c amodb a b b c end while return a end procedure

Wprowadzenie Zadania 1. Napisz, używając pseudokodu, procedurę Length(T ), która zwróci długość (liczbę elementów) listy przekazanej jako argument. 2. Napisz procedurę Average(T ), która dla danej listy T obliczy i zwróci sumę arytmetyczną jej elementów. Podpowiedź: w jednej pętli możesz policzyć zarówno sumę elementów jak i liczbę elementów listy. Wynikiem procedury będzie wynik ich dzielenia.

Wprowadzenie Zadania 3. Jaki wynik zwróci procedura GCD, jeżeli oba jej argumenty będą równe 0? Czy jest to poprawny wynik? 4. Procedura Fast-GCD nie sprawdza, czy a jest większe od b. Dlaczego nie jest to konieczne? Podpowiedź: jeżeli początkowo a < b, jakie będą wartości a i b po jednym przebiegu pętli while?

Algorytmy i struktury danych Złożoność obliczeniowa Letnie Warsztaty Matematyczno-Informatyczne

Złożoność obliczeniowa Czas wykonania algorytmu GCD(100, 1): 1. a = 100, b = 1 2. a = 99, b = 1... 99. a = 1, b = 1 100. a = 1, b = 0 Wynik: 1

Złożoność obliczeniowa Czas wykonania algorytmu GCD(100, 1): 1. a = 100, b = 1 2. a = 99, b = 1... 99. a = 1, b = 1 100. a = 1, b = 0 Wynik: 1 Fast-GCD(100, 1): 1. a = 100, b = 1 2. a = 1, b = 1 3. a = 1, b = 0 Wynik: 1

Złożoność obliczeniowa Czas wykonania algorytmu Pomysł: uznać, że każda operacja zajmuje 1 jednostkę czasu. Policzyć ile jednostek otrzymamy.

Złożoność obliczeniowa Czas wykonania algorytmu Pomysł: uznać, że każda operacja zajmuje 1 jednostkę czasu. Policzyć ile jednostek otrzymamy. Problem: w praktyce różne operacje wymagają różnej ilości czasu.

Złożoność obliczeniowa Czas wykonania algorytmu Pomysł: uznać, że każda operacja zajmuje 1 jednostkę czasu. Policzyć ile jednostek otrzymamy. Problem: w praktyce różne operacje wymagają różnej ilości czasu. Pomysł: przypisać każdej operacji jakąś stałą liczbę jednostek czasu.

Złożoność obliczeniowa Czas wykonania algorytmu Pomysł: uznać, że każda operacja zajmuje 1 jednostkę czasu. Policzyć ile jednostek otrzymamy. Problem: w praktyce różne operacje wymagają różnej ilości czasu. Pomysł: przypisać każdej operacji jakąś stałą liczbę jednostek czasu. Problem: czas wykonania pojedynczej operacji zależy od wielu czynników i nie jest stały.

Złożoność obliczeniowa Czas wykonania algorytmu Patrzeć będziemy na to, jak czas wykonania zmienia się w zależności od wielkości danych wejściowych.

Złożoność obliczeniowa Czas wykonania algorytmu Patrzeć będziemy na to, jak czas wykonania zmienia się w zależności od wielkości danych wejściowych. Na przykład czas wykonania procedury Minimum zmienia się liniowo względem liczby elementów T. To jest: jeżeli zwiększymy liczbę elementów T dwukrotnie, czas wykonania zwiększy się dwukrotnie.

Złożoność obliczeniowa Czas wykonania algorytmu Patrzeć będziemy na to, jak czas wykonania zmienia się w zależności od wielkości danych wejściowych. Na przykład czas wykonania procedury Minimum zmienia się liniowo względem liczby elementów T. To jest: jeżeli zwiększymy liczbę elementów T dwukrotnie, czas wykonania zwiększy się dwukrotnie. Czas wykonania procedury GCD zmienia się liniowo względem ilorazowi większej i mniejszej z liczb a i b.

Złożoność obliczeniowa Czas wykonania algorytmu Patrzeć będziemy na to, jak czas wykonania zmienia się w zależności od wielkości danych wejściowych. Na przykład czas wykonania procedury Minimum zmienia się liniowo względem liczby elementów T. To jest: jeżeli zwiększymy liczbę elementów T dwukrotnie, czas wykonania zwiększy się dwukrotnie. Czas wykonania procedury GCD zmienia się liniowo względem ilorazowi większej i mniejszej z liczb a i b. Czas wykonania procedury Fast-GCD zmienia się proporcjonalnie do logarytmu większej z liczb a i b.

Złożoność obliczeniowa Kres górny i dolny Ponieważ z reguły ciężko jest okreslić dokładną zależność między wielkością danych a czasem wykonania algorytmu, będziemy posługiwać się kresem górnym i dolnym (najczęściej tylko górnym). Brace yourselves, winter maths is coming.

Złożoność obliczeniowa Kres górny i dolny Funkcja g jest kresem dolnym funkcji f, jeżeli dla każdego x D f zachodzi g(x) f (x). Podobnie funkcja h jest kresem górnym funkcji f, jeżeli dla każdego x D f zachodzi h(x) f (x). Oczywiście zarówno g jak i h muszą mieć tę samą dziedzinę i przeciwdziedzinę co f.

Złożoność obliczeniowa Notacja wielkiego O (i podobne) Kresy górny i dolny nie stanowią same w sobie rozwiązania problemu. Jeżeli czas wykonania procedury rośnie liniowo, to jaki jest kres górny? g(x) = 2x? g(x) = 1000x? g(x) = G 64 x?

Złożoność obliczeniowa Notacja wielkiego O (i podobne) Kresy górny i dolny nie stanowią same w sobie rozwiązania problemu. Jeżeli czas wykonania procedury rośnie liniowo, to jaki jest kres górny? g(x) = 2x? g(x) = 1000x? g(x) = G 64 x? Z pomocą przychodzi notacja wielkiego O (i podobne).

Złożoność obliczeniowa Notacja wielkiego O (i podobne) Kresy górny i dolny nie stanowią same w sobie rozwiązania problemu. Jeżeli czas wykonania procedury rośnie liniowo, to jaki jest kres górny? g(x) = 2x? g(x) = 1000x? g(x) = G 64 x? Z pomocą przychodzi notacja wielkiego O (i podobne). Więcej matematyki!

Złożoność obliczeniowa Notacja wielkiego O (i podobne) Funkcja f należy do O (g(n)), jeżeli istnieje takie K i x 0, że dla każdego x x 0 zachodzi f (x) K g(x). Funkcja f należy do Ω (g(n)), jeżeli istnieje takie K i x 0, że dla każdego x x 0 zachodzi f (x) K g(x). W praktyce głównie używa się tego pierwszego zapisu.

Złożoność obliczeniowa Notacja wielkiego O (i podobne) Funkcja f należy do O (g(n)), jeżeli istnieje takie K i x 0, że dla każdego x x 0 zachodzi f (x) K g(x). Co daje nam notacja wielkiego O? 1. Nie musimy martwić się stałymi. Jeżeli funkcja należy do O(2x), to należy też to O(100x) i O(x). Stałe będziemy więc pomijać. 2. Nie musimy przejmować się nieistotnymi składnikami. Jeżeli funkcja należy do O(2 x + x 3 ), to należy również do O(2 x ). Wolniej rosnące składniki sumy będziemy pomijać.

Złożoność obliczeniowa Notacja wielkiego O (i podobne) Jeżeli więc czas wykonania algorytmu rośnie liniowo względem jakiegoś n, to mówimy, że ma złożoność obliczeniową O(n). Inne możliwości to między innymi O(2 n ), O(n 2 ), O(n log n), O(n), O(log n), O(1)...

Złożoność obliczeniowa Notacja wielkiego O (i podobne) Jeżeli więc czas wykonania algorytmu rośnie liniowo względem jakiegoś n, to mówimy, że ma złożoność obliczeniową O(n). Inne możliwości to między innymi O(2 n ), O(n 2 ), O(n log n), O(n), O(log n), O(1)... Zwróć uwagę, że O opisuje kres górny. Zatem jeżeli algorytm ma złożoność O(n), to możemy powiedzieć również, że ma złożoność O(n 2 ). W praktyce będziemy starali się znajdować jak najciaśniejszy kres, ponieważ niesie on ze sobą najwięcej informacji.