Algorytm i złożoność obliczeniowa algorytmu

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

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

Algorytm. a programowanie -

Zasady analizy algorytmów

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

ALGORYTMY I STRUKTURY DANYCH

2.8. Algorytmy, schematy, programy

Algorytmy w teorii liczb

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

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Podstawy Informatyki. Sprawność algorytmów

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

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

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

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

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

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

Algorytmy i struktury danych

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

Algorytmy i struktury danych. Wykład 4

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Informatyka 1. Złożoność obliczeniowa

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

Liczby całkowite i rzeczywiste

TEORETYCZNE PODSTAWY INFORMATYKI

LISTA 5. C++ PETLE for, while, do while

Złożoność Obliczeniowa Algorytmów

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

Informatyka A. Algorytmy

Wstęp do programowania

WHILE (wyrażenie) instrukcja;

Wprowadzenie do złożoności obliczeniowej

Programowanie - wykład 4

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

WHILE (wyrażenie) instrukcja;

Kompletna dokumentacja kontenera C++ vector w -

Wybrane zagadnienia teorii liczb

INFORMATYKA SORTOWANIE DANYCH.

ZADANIE 1. Ważenie (14 pkt)

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

Wprowadzenie do algorytmiki

Matematyka dyskretna

11. Liczby rzeczywiste

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.

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

Jeszcze o algorytmach

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

Algorytmy równoległe. Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2010

Zaawansowane algorytmy i struktury danych

Matematyczne Podstawy Informatyki

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

Zadanie 1. Suma silni (11 pkt)

Wstęp do programowania

1 Wprowadzenie do algorytmiki

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

TEORETYCZNE PODSTAWY INFORMATYKI

Algorytmika i pseudoprogramowanie

Konstrukcje warunkowe Pętle

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

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

Podstawy Programowania. Złożoność obliczeniowa

Funkcja kwadratowa. f(x) = ax 2 + bx + c,

Analiza algorytmów zadania podstawowe

Rekurencja (rekursja)

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

2) R stosuje w obliczeniach wzór na logarytm potęgi oraz wzór na zamianę podstawy logarytmu.

Programowanie w Baltie klasa VII

Przykładowe zadania z teorii liczb

Wstęp do programowania

Warunki logiczne instrukcja if

Język ludzki kod maszynowy

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

Funkcja kwadratowa. f(x) = ax 2 + bx + c = a

Złożoność algorytmów. Wstęp do Informatyki

1. Analiza algorytmów przypomnienie

Teoretyczne podstawy informatyki

Kontrola przebiegu programu

Wykład 2. Poprawność algorytmów

FUNKCJE. Kurs ZDAJ MATURĘ Z MATEMATYKI MODUŁ 5 Teoria funkcje cz.1. Definicja funkcji i wiadomości podstawowe

Technologie informacyjne Wykład VII-IX

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

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

Zaawansowane algorytmy i struktury danych

Zadania do samodzielnego rozwiązania

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

Teoretyczne podstawy informatyki

Efektywność algorytmów

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

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

Algorytm Euklidesa. Największy wspólny dzielnik dla danych dwóch liczb całkowitych to największa liczba naturalna dzieląca każdą z nich bez reszty.

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

Wstęp do programowania

Definicje. Algorytm to:

Programowanie dynamiczne

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

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

Technikum Nr 2 im. gen. Mieczysława Smorawińskiego w Zespole Szkół Ekonomicznych w Kaliszu

6. Pętle while. Przykłady

Lista 0. Kamil Matuszewski 1 marca 2016

Transkrypt:

Algorytm i złożoność obliczeniowa algorytmu 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 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ń 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 oraz od algorytmu ich przetwarzania 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 n2 + 500 => O(n2) f(n) = 1000 n => O(n) 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(n2) złożoność kwadratowa, O(nk) złożoność wielomianowa (k jest stałą), O(kn) złożoność wykładnicza (k jest stałą), O(n!) złożoność rzędu silnia

1,0E+12 1,0E+11 1,0E+10 1,0E+09 1,0E+08 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,0E-01 1,0E-02 1,0E-03 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 (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 algorytm Euklidesa - wersja z odejmowaniem WHILE A<>B IF A>B A <- A-B ELSE B <- B-A NWD = A NWD algorytm Euklidesa - wersja z resztą z dzielenia WHILE B<>0 R = A mod B A = B B = R NWD = A (ponieważ B=0)

Ciąg Fibonacciego Ciąg liczb naturalnych, zdefiniowany jako: Obliczanie liczby Fibonacciego, z definicji, w locie : 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 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] = 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 Najprostszy 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

Sposoby przyśpieszenia sprawdzania liczb pierwszych: 1. 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; 2. 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 3. 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 4. Sito Eratostenesa, tj. szukanie podzielnika tylko wśród liczb 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 Pomiar czasu wykonywania programu w C# 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. 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; 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);

Zadania Proszę napisać program, który 1. Znajduje NDW dwóch liczb podanych przez użytkownika za pomocą algorytmu Euklidesa przy pomocy różnic i reszt z dzielenia Program należy też uruchomić w trybie debugowania (krokowym) i obserwować wartości zmiennych w oknie locals lub watches 2. Wykonuje zadania z punktu 1 i dodatkowo zlicza iteracje ( obroty pętli ) wykonane podczas wyznaczania NWD. Który algorytm jest lepszy i dlaczego? Jak zmienia się liczba iteracji przy rosnących wartościach A i B? A przy rosnącej różnicy A i B? Rosnącym ilorazie A i B? 3. * Znajduje parę liczb względnie pierwszych (NWD=1), większych od liczby podanej przez użytkownika. Należy opracować dwa warianty algorytmu częściowo stochastyczny (jedna liczba jest równa liczbie podanej przez użytkownika, druga losowana, do skutku) i całkowicie stochastyczny (obie liczby są losowane, do skutku). 4. * Wykonuje zadania z punktu 3 tak, aby dodatkowo mierzyć czas obliczeń. Który wariant algorytmu jest szybszy? 5. Wyznacza n-ty element ciągu Fibonacciego (n podaje użytkownik) 6. Wyznacza n kolejnych liczb Fibonacciego i zapisuje je do tablicy. Po zakończeniu obliczeń wszystkie wyznaczone liczby należy wyświetlić w oknie konsoli 7. Sprawdza, czy liczna podana przez użytkownika jest liczbą pierwszą; należy zastosować najprostszy algorytm testu pierwszości 8. Wyświetla wszystkie liczby pierwsze zawarte w przedziale wskazanym przez użytkownika (od A do B albo od 1 do A); należy zastosować najprostszy algorytm testu pierwszości 9. Wyznacza liczbę liczb pierwszych w przedziale wskazanym przez użytkownika (od A do B albo od 1 do A); należy zastosować najprostszy algorytm testu pierwszości 10. Wykonuje zadania z punktu 9, ale stosując szybsze wersje algorytmu (należy zachować je wszystkie, będą potrzebne do zadania 12). Należy też zmierzyć i porównać czasy wykonania każdego algorytmu dla tej samej wielkości przedziału liczb. 11. * Znajduje pierwszych N liczb pierwszych większych od liczby A i zapisuje je do tablicy. Liczby N i A podaje użytkownik. Po zakończeniu obliczeń wszystkie wyznaczone liczby należy wyświetlić w oknie konsoli

1,0E+10 1,0E+09 1,0E+08 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,0E-01 1,0E-02 1,0E-03 1,0E-04 1,0E-05 1,0E-06 10 100 1000 10000 100000 1000000 10000000 100000000 N*logN N^2??? 12. * Wykonuje zadania z punktu 10 w sposób pozwalający eksperymentalnie ocenić złożoność obliczeniową poszczególnych algorytmów. Należy sporządzić w programie Excel wykres funkcji k n 2 oraz k n log n, tak aby stałą k można było zmieniać. Nanieść na wykres wyniki pomiaru czasu wykonania różnych algorytmów i ocenić złożoność obliczeniową. Wykres powinien mieć obie skale logarytmiczne. Zmieniając stałą k można przesuwać linie O(n 2 ) i O(nlogn) w górę lub w dół. Złożoność obliczeniowa wynika z nachylenia linii, a nie wartości, np. na przykładowym wykresie powyżej złożoność algorytmu??? jest O(n 2 ), ponieważ nachylenie linii jest prawie takie samo, jak dla linii N 2. To, że linia??? leży bliżej linii N*logN, jest bez znaczenia.