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

Podobne dokumenty
Algorytm i złożoność obliczeniowa algorytmu

Algorytm. a programowanie -

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

Dr inż. Robert Wójcik, p. 313, C-3, tel Katedra Informatyki Technicznej (K-9) Wydział Elektroniki (W-4) Politechnika Wrocławska

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

Algorytmy w teorii liczb

Zasady analizy algorytmów

ALGORYTMY MATEMATYCZNE Ćwiczenie 1 Na podstawie schematu blokowego pewnego algorytmu (rys 1), napisz listę kroków tego algorytmu:

Wprowadzenie do złożoności obliczeniowej

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

1 Wprowadzenie do algorytmiki

Matematyczne Podstawy Informatyki

Wybrane zagadnienia teorii liczb

Największy wspólny dzielnik Algorytm Euklidesa (także rozszerzony) WZAiP1: Chińskie twierdzenie o resztach

Informatyka A. Algorytmy

Definicje. Algorytm to:

Informatyka 1. Złożoność obliczeniowa

Podstawy Informatyki. Sprawność algorytmów

Zaawansowane algorytmy i struktury danych

Algorytmy i struktury danych

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

5. Rekurencja. Przykłady

TEORETYCZNE PODSTAWY INFORMATYKI

Wykład 4. Określimy teraz pewną ważną klasę pierścieni.

Wrocław, Wstęp do informatyki i programowania: liczby pierwsze. Wydział Matematyki Politechniki Wrocławskiej.

2.8. Algorytmy, schematy, programy

Algorytmy i struktury danych. Wykład 4

Wprowadzenie do algorytmiki

Technologie informacyjne Wykład VII-IX

Kodowanie i kompresja Streszczenie Studia Licencjackie Wykład 15, Kryptografia: algorytmy asymetryczne (RSA)

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Analiza algorytmów zadania podstawowe

(mniejszych od 10 9 ) podanych przez użytkownika, wypisze komunikat TAK, jeśli są to liczby bliźniacze i NIE, w przeciwnym przypadku.

Zadania do samodzielnego rozwiązania

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

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

Porównanie czasów działania algorytmów sortowania przez wstawianie i scalanie

Matematyka dyskretna

ALGORYTMY I STRUKTURY DANYCH

Język ludzki kod maszynowy

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Wstęp do programowania

11. Liczby rzeczywiste

Jeśli czas działania algorytmu zależy nie tylko od rozmiaru danych wejściowych i przyjmuje różne wartości dla różnych danych o tym samym rozmiarze,

1. Liczby wymierne. x dla x 0 (wartością bezwzględną liczby nieujemnej jest ta sama liczba)

Wstęp do Informatyki

Złożoność Obliczeniowa Algorytmów

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Liczby całkowite i rzeczywiste

Kodowanie i kompresja Streszczenie Studia Licencjackie Wykład 14, Kryptografia: algorytmy asymetryczne (RSA)

Podstawy Programowania. Złożoność obliczeniowa

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

Algorytmy komputerowe. dr inŝ. Jarosław Forenc

Rekurencja. Przykład. Rozważmy ciąg

w analizie wyników badań eksperymentalnych, w problemach modelowania zjawisk fizycznych, w analizie obserwacji statystycznych.

ZADANIE 1. Ważenie (14 pkt)

Aproksymacja funkcji a regresja symboliczna

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

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

REPREZENTACJA LICZBY, BŁĘDY, ALGORYTMY W OBLICZENIACH

TEORETYCZNE PODSTAWY INFORMATYKI

1. Analiza algorytmów przypomnienie

FUNKCJA REKURENCYJNA. function s(n:integer):integer; begin if (n>1) then s:=n*s(n-1); else s:=1; end;

Wieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa

Wstęp do programowania

Jeszcze o algorytmach

Algorytmy komputerowe. dr inż. Jarosław Forenc

Złożoność obliczeniowa zadania, zestaw 2

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

Algorytmika i pseudoprogramowanie

Efektywność algorytmów

Podstawy algorytmiki i programowania - wykład 3 Funkcje rekurencyjne Wyszukiwanie liniowe i binarne w tablicy

Zadanie 1. Test (6 pkt) Zaznacz znakiem X w odpowiedniej kolumnie P lub F, która odpowiedź jest prawdziwa, a która fałszywa.

WHILE (wyrażenie) instrukcja;

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Matematyka dyskretna. Andrzej Łachwa, UJ, 2019 Zadania 1-100

Zaawansowane algorytmy i struktury danych

Wykład 2. Poprawność algorytmów

3. Podaj elementy składowe jakie powinna uwzględniać definicja informatyki.

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

Pętla for. Matematyka dla ciekawych świata -19- Scilab. for i=1:10... end. for k=4:-1:1... end. k=3 k=4. k=1. k=2

EGZAMIN MATURALNY Z INFORMATYKI 13 MAJA 2019 POZIOM ROZSZERZONY. Godzina rozpoczęcia: 14:00 CZĘŚĆ I WYBRANE: Czas pracy: 90 minut

Rekurencja (rekursja)

4. Funkcje. Przykłady

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Język C część 2. Podejmowanie decyzji w programie. if else. switch

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wykład 1. Na początku zajmować się będziemy zbiorem liczb całkowitych

Systemy liczbowe. 1. Przedstawić w postaci sumy wag poszczególnych cyfr liczbę rzeczywistą R = (10).

1. LICZBY DZIAŁ Z PODRĘCZNIKA L.P. NaCoBeZu kryteria sukcesu w języku ucznia

REPREZENTACJA LICZBY, BŁĘDY, ALGORYTMY W OBLICZENIACH

Algorytmy i Struktury Danych

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

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

Sortowanie - wybrane algorytmy

Informatyka wprowadzenie do algorytmów (II) dr hab. inż. Mikołaj Morzy

Teoretyczne podstawy informatyki

Wstęp do programowania

Zapis algorytmów: schematy blokowe i pseudokod 1

Wymagania edukacyjne z matematyki dla zasadniczej szkoły zawodowej na poszczególne oceny

Transkrypt:

Podstawy programowania Podstawy C# Przykłady algorytmów

Proces tworzenia programu Sformułowanie problemu funkcje programu zakres i postać danych postać i dokładność wyników Wybór / opracowanie metody rozwiązania znaleźć matematyczne metody rozwiązania wybrać najbardziej odpowiednią Opracowanie algorytmu

Algorytm Algorytm - przepis postępowania, którego wykonanie prowadzi do rozwiązania określonego problemu określa czynności, jakie należy wykonać wyszczególnia wszystkie niezbędne czynności oraz kolejność ich wykonania precyzyjny na tyle, aby posługiwanie się nim polegało na automatycznym wykonaniu czynności

Algorytm Pożądane cechy algorytmu Masowość Skończoność wykonania Jednoznaczność zapisu Niezawodność - brak błędów w algorytmie - odporność na błędy ujawniające się podczas wykonywania Algorytmy komputerowe powinny uwzględniać ograniczoność zasobów powinny być wykonywane w skończonym czasie, przy wykorzystaniu skończonej ilości pamięci. Tam, gdzie nie jest to możliwe lub opłacalne, stosuje się algorytmy znajdujące rozwiązania przybliżone

Algorytm Metody zapisu algorytmów (m.in.): Pseudokod Przypomina język programowania, ale nie jest tak restrykcyjny składniowo; daje się łatwo przełożyć na kod Język sieci działań (flow chart) Graficzny zapis przy użyciu standardowych symboli (operacja we/wy, operacja, warunek) strzałki pokazują kolejność działań min = t 0 instrukcja FOR n=1, 2,, N-1 IF t n < min => min = t n true warunek false

Złożoność obliczeniowa Złożoność obliczeniowa to ilość zasobów niezbędna do wykonania algorytmu. Wyróżnia się dwa rodzaje: Złożoność czasową (obliczeniową) Złożoność pamięciową Złożoność zależy od rozmiaru danych wejściowych (np. sortowanie, niezależnie od użytego algorytmu, będzie trwało tym dłużej, im większy jest zbiór sortowanych elementów)

Złożoność obliczeniowa Istnieje wiele miar złożoności obliczeniowej i wiele notacji. W większości miar najważniejsze jest asymptotyczne tempo wzrostu (tj. jak złożoność rośnie ze wzrostem rozmiaru danych). Do porównywania algorytmów najczęściej używa się notacji O (dużego O), która podaje asymptotyczne ograniczenie górne W notacji O uwzględnia się tylko funkcję dominującą i pomija się współczynniki liczbowe, ponieważ dla odpowiednio dużych zbiorów danych współczynniki stałe mają mniej istotne znaczenie niż rodzaj funkcji dominującej, np. f(n) = 100 n 2 + 500 => O(n 2 ) f(n) = 1000 n => O(n)

Złożoność obliczeniowa Przykładowe złożoności algorytmów, w porządku rosnącym: O(1) złożoność stała, O(logn) złożoność logarytmiczna, O(n) złożoność liniowa, O(nlogn) złożoność liniowo-logarytmiczna, O(n 2 ) złożoność kwadratowa, O(n k ) złożoność wielomianowa (k jest stałą), O(k n ) złożoność wykładnicza (k jest stałą), O(n!) złożoność rzędu silnia

Złożoność obliczeniona 1,0E+12 1,0E+11 1,0E+10 1000 lat 100 lat 1,0E+09 1,0E+08 1 rok 1,0E+07 1,0E+06 1,0E+05 1,0E+04 1,0E+03 1,0E+02 1,0E+01 1,0E+00 1 doba 1 godz. 1 min. 1 s 1,0E-01 1,0E-02 1,0E-03 1 ms 1,0E-04 1,0E-05 1,0E-06 1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 1E+10 N N*logN N^2 2^N N!

NWD NWD (największy wspólny dzielnik), algorytm Euklidesa Największy wspólny dzielnik dwóch liczb nie zmienia się, jeżeli od większej liczby odejmujemy mniejszą. Dla liczb całkowitych k, m oraz n załóżmy, że k jest wspólnym czynnikiem liczb A oraz B : A = n k B = m k oraz A>B Różnicę A i B można zapisać jako: A B = (n m) k więc k jest także wspólnym czynnikiem różnicy tych liczb Szukanie NWD polega na zmniejszaniu A o B (lub odwrotnie, zależnie która jest większa) aż do zrównania się tych liczb, wtedy A=B=NWD Proces można przyśpieszyć obliczając resztę z dzielenia zamiast różnicy

NWD NWD algorytm Euklidesa Wersja z odejmowaniem WHILE A<>B IF A>B A <- A-B ELSE B <- B-A NWD = A

NWD NWD algorytm Euklidesa Wersja z resztą z dzielenia WHILE B<>0 R = A mod B A = B B = R NWD = A (ponieważ B=0)

NWD NWD algorytm Euklidesa Wersja rekurencyjna NWD(A, B) IF B=0 return A ELSE return NWD(B, A mod B) Wersja rekurencyjna z operatorem warunkowym NWD(A, B) return B=0? A : NWD(B, A mod B)

Ciąg Fibonacciego Ciąg liczb naturalnych, zdefiniowany jako: Liczby Fibonacciego można znaleźć w przygodzie; Ciekawy jest związek liczb Fibonacciego z tzw. złotym podziałem (złotą proporcją):

Ciąg Fibonacciego Obliczanie liczby Fibonacciego, z definicji, w postaci pseudofunkcji oraz "w locie" Fibonacci (n) IF n=0 return 0 IF n=1 return 1 fa = 0 fb = 1 FOR i = 2 N fi = fa + fb fa = fb fb = fi return fi IF n=0 Fibonacci = 0 ELSE IF n=1 Fibonacci = 1 ELSE fa = 0 fb = 1 FOR i = 2 N fi = fa + fb fa = fb fb = fi Fibonacci =fi

Ciąg Fibonacciego Zamiast obliczać liczby Fibonacciego "w locie", można zapisywać je w tablicy. Algorytm jest wtedy znacznie prostszy, a dodatkowo może się przydać, jeżeli program kożysta z nich wielokrotnie wówczas zamiast liczyć je od nowa, można odczytać z tablicy // F[N] tablica N-elementowa (uwaga! Tu jest pułapka) F[0] = 0 F[1] = 1 FOR n=2, 3, (jak daleko???) F[n] =

Ciąg Fibonacciego Obliczanie liczby Fibonacciego rekurencyjnie Fibonacci (n) IF n=0 return 0 IF n=1 return 1 return Fibonacci(n-1) Fibonacci(n-2)

Liczby pierwsze Liczby które mają dwa naturalne dzielniki: 1 i siebie samą; Mają duże znaczenie w matematyce i informatyce, np. wiele algorytmów kryptograficznych wykorzystuje liczby pierwsze Największą znaną liczbą pierwszą jest liczba pierwsza należąca do liczb Mersenne'a: M(n) = 2 n 1 jest to 50 liczba pierwsza Mersenne'a, znaleziona w styczniu 2018: M(77.232.917) = 2 77.232.917 1 ma 23 miliony cyfr (zapis tej liczby to ~9000 stron) Projekt GIMPS zarobił 100.000 USD za znalezienie liczby pierwszej Mersenne'a mającej powyżej 10 milionów cyfr M(43.112.609), była to 47 liczba pierwsza Mersenne'a, znaleziona w 2008 r; Kolejna nagroda 150.000 USD za liczbę pierwszą ponad 100 mln cyfr!

Liczby pierwsze Algorytm sprawdzania czy liczba jest liczbą pierwszą, wynikający wprost z definicji liczby pierwszej, to policzenie naturalnych podzielników jeżeli są dokładnie 2, to liczba jest pierwsza. Jest to najprostsza, ale też najgorsza (najwolniejsza) metoda Pierwsza (N) d = 0 FOR i = 1, 2,, N IF n mod i = 0 d = d + 1 IF d=2 return TRUE ELSE return FALSE

Liczby pierwsze Sposoby przyśpieszenia sprawdzania liczb pierwszych: Pominięcie podzielników 1 i N Każda liczba dzieli się przez jeden i siebie, więc po co to sprawdzać? Trzeba odpowiednio zmienić pętlę oraz kryterium "pierwszości" Zysk minimalny, ale warto zwracać uwagę na takie detale; Sprawdzanie "do pierwszej wpadki" Tak naprawdę nie jest ważne ILE dokładnie jest podzielników, tylko czy dokładnie 2 czy więcej. Sprawdzanie należy prowadzić w zakresie 2 N i zakończyć po znalezieniu pierwszego podzielnika

Liczby pierwsze Sposoby przyśpieszenia sprawdzania liczb pierwszych: Sprawdzanie podzielników do N Można łatwo wykazać, że jeżeli p = N, to dla każdego podzielnika a, takiego że a p, mamy N/a = b, gdzie b p, Wynika stąd, że wystarczy szukać podzielnika tylko do N WŁĄCZNIE jeżeli go nie ma, to powyżej N też nie będzie. Zmniejszenie złożoności obliczeniowej jest tu duże

Liczby pierwsze Sposoby przyśpieszenia sprawdzania liczb pierwszych: sito Eratostenesa, tj. szukanie podzielnika tylko wśród liczb pierwszych (jeżeli jakaś liczba nie dzieli się przez 2 i 3, to przez 6, 8, 9, itd. też nie będzie, ponieważ liczby nie-pierwsze są iloczynami mniejszych od siebie pierwszych) Uwzględniając poprzedni postulat należy szukać podzielnika tylko wśród liczb pierwszych, mniejszych lub równych N Implementacja jest trudna, ponieważ najpierw trzeba znaleźć liczby pierwsze N (a nie wiadomo dokładnie ile ich jest), zapisać np. w tablicy i dopiero sprawdzać, czy wśród nich jest podzielnik N Są jeszcze algorytmy probabilistyczne (np. Fermata, Millera-Rabina), wykorzystujące liczby losowe i dające odpowiedź wysoce prawdopodobną, lecz nie całkowicie pewną

Przydatne narzędzia W programach C# można łatwo zmierzyć czas wykonywania obliczeń przy pomocy "stopera" z biblioteki Diagnostics: System.Diagnostics.Stopwatch watch; watch = System.Diagnostics.Stopwatch.StartNew(); // działania, których czas jest mierzony watch.stop(); Console.WriteLine("Czas: {0}", watch.elapsed); Dokładność pomiaru czasu jest bardzo duża, rzędu ułamków mikrosekundy - wynika z częstotliwości taktowania procesora. W poważniejszych zastosowaniach używa się specjalnego narzędzia, nazywanego w języku angielski "Profiler"

Przydatne narzędzia Zamiast powtarzać nazwę biblioteki (System.Diagnostics) przy każdym odwołaniu do klasy Stopwatch, można ją dopisać na samym początku programu w klauzuli using: using System.Diagnostics; Stopwatch watch; watch = Stopwatch.StartNew(); // działania, których czas jest mierzony watch.stop(); Console.WriteLine("Czas: {0}", watch.elapsed);

Przydatne narzędzia Metoda statyczna StartNew() tworzy za każdym użyciem nową instancję; zamiast tego można utworzyć instancję raz, a następnie resetować i zarazem uruchamiać stoper metodą Restart(): using System.Diagnostics; Stopwatch watch; watch = new Stopwatch (); watch.restart(); // działania, których czas jest mierzony watch.stop(); Console.WriteLine("Czas: {0}", watch.elapsed);