Informatyka II wykłady 1 i 2 Algorytmy
Transkrypt
Informatyka II wykłady 1 i 2 Algorytmy
Katedra Elektrotechniki Teoretycznej i Informatyki sem. II - Elementy algorytmów Dr hab. inż. M. Czyżak REGULAMIN zaliczeń i wystawiania ocen z przedmiotu Informatyka II realizowanych w Katedrze Elektrotechniki Teoretycznej i Informatyki na studiach stacjonarnych I stopnia na kierunku Elektrotechnika w sem. III, 2016/2017 1. Obecność studentów na wykładach i laboratorium jest obowiązkowa. 2. Na wykładzie i laboratorium obecność jest kontrolowana. W przypadku stwierdzenia 3 – krotnej nieusprawiedliwionej nieobecności na laboratorium, student jest skreślany z listy uczestniczących w laboratorium i nie jest klasyfikowany. 3. Podczas semestru 2– krotnie przeprowadzane jest kolokwium na laboratorium (90 min) – zgodnie z podanym harmonogramem laboratorium. 4. W przypadku usprawiedliwionej nieobecności na kolokwium, potwierdzonej zwolnieniem lekarskim, student jest zobowiązany w terminie 2 tygodni od daty zakończenia zwolnienia odrobić kolokwium w godzinach konsultacji. W przypadku nieobecności nieusprawiedliwionej lub nie odrobienia w podanym terminie usprawiedliwionej nieobecności na kolokwium, student otrzymuje 0 punktów z kolokwium. 5. Zaliczenie laboratorium następuje w oparciu o ilość punktów uzyskanych przez studenta. Podział punktów dla laboratorium na poszczególne elementy jest następujący: -– kolokwia 60 pkt ( 2 x 30 pkt) -– wejściówki 20 pkt -– zadania domowe 20 pkt Zaliczenie laboratorium wymaga 60 pkt, konieczne jest też uzyskanie przynajmniej 30 pkt łącznie z kolokwiów. Zadania domowe należy oddać w terminie dwóch tygodni. Prowadzący zajęcia laboratoryjne wystawia oceny punktowe. 6. Zaliczenie części wykładowej następuje w oparciu o kolokwium organizowane na koniec semestru, prace domowe oraz obecność na wykładzie (80 pkt kolokwium, 20 pkt prace domowe). Student może dodatkowo uzyskać 10 pkt za zadania wykonywane na wykładzie (1 pkt za jedno zadanie, w przypadku niepoprawnego wykonania zadania 0.5 pkt). Zaliczenie części wykładowej wymaga uzyskania 60 pkt w tym przynajmniej 41 pkt z kolokwium wykładowego) 7. Na zakończenie zajęć w semestrze oblicza się końcową punktową ocenę każdego studenta, wg wzoru: Z 0.66 * L 0.34 *W gdzie: L – ocena punktowa uzyskana z części laboratoryjnej, W – ocena punktowa uzyskana z części wykładowej. 8. Ocenę końcową wystawia przedstawionych w tabeli: się wg progów punktowych Progi punktowe Ocena poniżej 60 niedostateczna 60 - 66 dostateczna 67 - 73 dość dobra 74 - 80 dobra 81 - 87 ponad dobra powyżej 88 bardzo dobra 9. Prowadzący laboratorium organizuje dodatkowe kolokwium zaliczające laboratorium bezpośrednio przed sesją podstawową oraz kolokwium zaliczające w sesji poprawkowej. W wyniku każdego z tych kolokwiów student może otrzymać połowę maksymalnej ilości punktów z kolokwiów czyli 30 pkt. 10. Dla studentów, którzy nie uzyskali wymaganego minimum punktów z kolokwium zaliczającego wykład, organizowane jest kolokwium poprawkowe z części wykładowej w sesji poprawkowej. 11. W wyniku kolokwium poprawkowego z części wykładowej można uzyskać tylko połowę maksymalnej liczby punktów, czyli 40 pkt. 12. Obliczanie ocen po sesji poprawkowej odbywa się z uwzględnieniem wyniku kolokwium poprawkowego oraz pozostałych elementów składających się na część laboratoryjną i wykładową. Algorytmy Algorytm jest jednym z zasadniczych pojęć w informatyce. Dział nauki zajmujący się algorytmami jest określany jako "Teoria algorytmów", "Analiza algorytmów" czy też "Algorytmika". Algorytm ( nieformalne określenie) 1. Algorytm jest przepisem określającym krok po kroku rozwiązanie jakiegoś problemu lub też osiągnięcie pewnego celu. Algorytmy 2. Algorytm jest pewną ściśle określoną procedurą obliczeniową, która dla właściwych danych wejściowych, wytwarza dane wyjściowe zwane wynikiem działania algorytmu. Algorytm można też traktować jako sposób rozwiązania konkretnego problemu obliczeniowego. Postawienie takiego problemu polega na ustaleniu wymagań, co do relacji między danymi wejściowymi algorytmu, a danymi wyjściowymi, a algorytm opisuje procedurę obliczeniową, która zapewni, że relacja ta będzie osiągnięta. Algorytmy Problemy, które można rozpatrywać w aspekcie ich rozwiązywania z użyciem algorytmów, można podzielić na następujące grupy: a) problemy niealgorytmiczne - wykazano, że nie mogą być rozwiązane za pomocą algorytmów w skończonym czasie Przykład 1. Pokrywanie powierzchni wielokątami o dowolnym kształcie. Wykazano, że to zadanie jest obliczeniowo nierozwiązywalne. Przykład 2. Rozwiązywanie równań diofantycznych xn yn z n Dla n=2 nieskończenie wiele rozwiązań w liczbach całkowitych, brak rozwiązań dla n>2. Algorytmy b) problemy przypuszczalnie niealgorytmiczne zadania dla których nie udało się znaleźć algorytmu o skończonym czasie działania, ale też nie udowodniono, że taki algorytm nie istnieje (nie mogą być rozwiązane za pomocą algorytmów w skończonym czasie) c) problemy wykładnicze - nie mają algorytmów ograniczonych przez wielomian zmiennej problemu ( np. n!) Algorytmy d) problemy przypuszczalnie wykładnicze - nie udało się podać algorytmu wielomianowego, ale też nie udowodniono że nie ma takiego algorytmu. d) problemy wielomianowe - dla problemów tych istnieją algorytmy rozwiązujące je w czasie ograniczonym wielomianem zmiennej problemu. Kubale, M. Łagodne wprowadzenie do analizy algorytmów, Wyd. PG, 1999. Algorytmy Słowo algorytm pochodzi od nazwiska matematyka arabskiego żyjącego w IX wieku Abu Ja'far Mohammed ibn Müsâ al Khowârizmî ( al Khorezmi, (ar.) z Chorezmu) , nazwisko jego pisano w Europie jako Algorismus. Podał on w IX wieku reguły dodawania, odejmowania, mnożenia i dzielenia liczb dziesiętnych znane wcześniej w Indiach i Chinach. Algorytmy Jednak za autora pierwszego algorytmu uważa się greckiego matematyka Euklidesa ( 365 p.n.e- 300 p.n.e), stworzył on słynny przepis na obliczanie największego wspólnego dzielnika dwóch liczb całkowitych a i b ( NWD, gcd - ang. greatest common divisor) Algorytmy Algorytm Euklidesa - obliczanie gcd (a,b) gcd(a,0)=0 Dopóki b>0 wykonuj 1. c=a modulo b 2. a=b 3. b=c 4. gcd=a Operacja = oznacza, podobnie jak w języku C, podstawienie do zmiennej po lewej stronie, wartości wyrażenia po prawej stronie. Algorytmy Przykład. Zastosowanie algorytmu Euklidesa dla a=30, b=21. I. II. III. 1. c=9 1. c=3 1. c=0 2. a=21 2. a=9 2. a=3 3. b=9 3. b=3 3. b=0 4. gcd=21 4. gcd=9 4. gcd=3 b>0 b=0, stop b>0 Algorytmy Sposoby opisu (zapisu algorytmów) cz.1 1. Opis słowny 2. Opis w postaci listy kolejnych kroków 3. Opis w języku programowania ( Pascal, C/C++) 4. Opis w postaci schematu blokowego Przykład. Opis słowny Cel działania algorytmu: algorytm sprawdza czy dana liczba naturalna N jest liczbą pierwszą. Realizacja algorytmu (algorytm): algorytm oblicza całkowitą resztę z dzielenia N przez kolejne liczby nieparzyste mniejsze lub równe N . Jeśli jakaś reszta jest równa zeru, algorytm przerywa działanie. Algorytmy Sposoby opisu (zapisu algorytmów) cz.2 2. Opis w postaci listy kolejnych kroków Przykład. Zapis algorytmu Euklidesa w postaci listy kroków. Dane: Liczby całkowite a i b. Wynik: Największy wspólny dzielnik a i b, gcd(a,b). 1. Wczytaj a. 2. Wczytaj b. 3. Jeśli b=0, idź do kroku 10. 4. Oblicz c=a modulo b. 5. Wykonaj a=b. 6. Wykonaj b=c. Algorytmy Sposoby opisu (zapisu algorytmów) cz.3 Przykład. Zapis algorytmu Euklidesa w postaci listy kroków ( cz. II). 7. Wykonaj gcd=a. 8. Jeśli b=0, idź do kroku 4. 9. Idź do kroku 11. 10. gcd=0. 11. Drukuj a, b, gcd. 12. STOP . Algorytmy Sposoby opisu (zapisu algorytmów) cz.4 Przykład. Zapis algorytmu Euklidesa w postaci programu int main() { int a=30,b=21,c,gcd; do { c=a%b; a=b; b=c; gcd=a; } while ( b>0); printf("\n a=%d b=%d gcd=%d ",a,b,gcd); } Algorytmy Sposoby opisu (zapisu algorytmów) cz.5 Sieci działań ( schematy blokowe) Autorem tej koncepcji jest John von Neumann. Zaproponował on w latach 50-tych formalizację algorytmów przy użyciu sieci działań. Sieci działań są geometrycznym sposobem zapisu algorytmów. Podstawą tej koncepcji jest podzielenie procesu rozwiązania na odrębne etapy, które w sieci działań przedstawia się w postaci bloków. Bloki są prostymi figurami geometrycznymi. Algorytmy Sposoby opisu (zapisu algorytmów) cz.6 Sieci działań ( schematy blokowe) Wewnątrz bloków umieszcza się rodzaj czynności, którą symbolizuje dany blok. Bloki łączy się liniami, które ukazują ich powiązania logiczne, a strzałki wskazują na kolejność wykonywania poszczególnych w algorytmie. Algorytm przedstawiony w postaci sieci działań jest niezależny od języka programowania, w którym będzie napisany program. Algorytmy Sposoby opisu (zapisu algorytmów) cz.7 Sieci działań ( schematy blokowe) Sieci działań mogą być pisane na różnym poziomie szczegółowości, lecz zwykle przyjmuje się, że każdy blok odpowiada jednej instrukcji programu realizującej pewne obliczenie lub instrukcji, która umożliwia podjęcie decyzji w algorytmie odnośnie dalszej jego realizacji. Algorytmy Sposoby opisu (zapisu algorytmów) cz.8 Sieci działań ( schematy blokowe) Wewnątrz bloków sieci działań można stosować następujące symbole: , - litery alfabetu łacińskiego i greckiego - cyfry systemu dziesiętnego - symbole działań arytmetycznych - dodawanie + - odejmowanie - Algorytmy Sposoby opisu (zapisu algorytmów) cz.9 Sieci działań ( schematy blokowe) - symbole działań arytmetycznych (c.d.) - mnożenie lub - dzielenie / - dzielenie całkowite - potęgowanie - pierwiastkowanie Algorytmy Sposoby opisu (zapisu algorytmów) cz.10 Sieci działań ( schematy blokowe) - symbole działań logicznych - negacja ~ - koniunkcja - alternatywa Algorytmy Sposoby opisu (zapisu algorytmów) cz.11 Sieci działań ( schematy blokowe) - symbole relacji , , , , , - symbol podstawienia ,:= - znaki interpunkcyjne Wewnątrz bloków sieci działań można ponadto stosować liczby całkowite, rzeczywiste, zespolone jednak o wielkości odpowiadającej wielkości typów dla komputera, na którym będzie realizowany algorytm. Algorytmy Sposoby opisu (zapisu algorytmów) cz.12 Sieci działań ( schematy blokowe) - stałe logiczne - stałe tekstowe - zmienne i wskaźniki do zmiennych (użycie zmiennej wskazuje, że będzie istniała komórka pamięci, o nazwie takiej, jak nazwa zmiennej) Algorytmy Sposoby opisu (zapisu algorytmów) cz.13 Sieci działań ( schematy blokowe) - wyrażenia arytmetyczne i logiczne - funkcje ( wykładnicze, logarytmiczne, trygonometryczne, cyklometryczne, hiperboliczne i odwrotne do nich) - wartość bezwzględna - część całkowita Algorytmy Sposoby opisu (zapisu algorytmów) cz.14 Sieci działań ( schematy blokowe) Symbole geometryczne - początek algorytmu START - koniec algorytmu STOP Algorytmy Sposoby opisu (zapisu algorytmów) cz.15 Sieci działań ( schematy blokowe) Operator - działanie (operacja do wykonania) Operator wejścia/wyjścia wprowadzanie lub wyprowadzanie danych Operator - element decyzyjny- wybór jednej z dróg działania Algorytmy Sposoby opisu (zapisu algorytmów) cz.16 Sieci działań ( schematy blokowe) Łącznik - łączy dwie części algorytmu Linia - łącząca poszczególne symbole sieci działań Algorytmy Struktura algorytmów (cz.1) Opis algorytmu w postaci sieci działań wymaga zwykle niewielu podstawowych elementów takich jak - sekwencja operacji - przełącznik - pętla Algorytmy Struktura algorytmów (cz.2) Sekwencja operacji Sekwencja operacji stanowi zbiór operacji realizowanych w określonej kolejności na określonych danych. Przykład. Realizacja obliczenia y (c (a b) ) d 2 Algorytmy Struktura algorytmów (cz.3) dane a,b,c,d wyznacz a+b wyznacz (a+b)2 wyznacz c+(a+b)2 wyznacz (c+(a+b)2)d dane a,b,c,d y <- a+b y <-y*y y <-y+c y <-y*c Algorytmy Struktura algorytmów (cz.4) Przełącznik Przełącznik jest elementem sprawdzającym spełnienie określonego warunku i wybierającego jedną z dwóch alternatywnych sekwencji operacji w zależności od tego czy warunek jest spełniony czy też nie. Przykład. TAK Sekwencja 1 a>0 NIE Sekwencja 2 Algorytmy Struktura algorytmów (cz.4) Pętla Pętla jest elementem umożliwiającą kolejną, wielokrotną realizację określonej operacji lub sekwencji operacji. Algorytmy Ogólna struktura pętli Część inicjacyjna Część główna Część aktualizująca warunek Część decyzyjna Część wyjściowa Algorytmy Przykład. Sieć działań dla obliczania sumy (cz. 1) n 1 1 S i 1 i Algorytmy Przykład. Sieć działań dla obliczania sumy (cz. 2) START s<-0 s<-s+1/i i<-i+1 TAK i<n NIE Drukuj s STOP Algorytmy Nauka o algorytmach to teoria algorytmów zwana też analizą algorytmów. Zajmuje się ona szukaniem najlepszych algorytmów dla rozwiązywania określonych zadań na komputerach, badaniem możliwości rozwiązania pewnych zadań jak również określaniem złożoności rozwiązań, o ile one istnieją. Algorytmy Przykłady algorytmów (1) I. Algorytmy numeryczne 1. Interpolacja Lagrange’a. 2. Interpolacja Aitkena-Lagrange’a. 3. Aproksymacja wielomianowa. 4. Aproksymacja trygonometryczna. 5. Kwadratura Newtona-Cotesa. 6. Metoda całkowania Romberga. 7. Metoda rozwiązywania równań nieliniowych (bisekcja, metoda siecznych, metoda Newtona). Algorytmy Przykłady algorytmów (2) 8. Rozwiązywanie układu równań z macierzą trójkątną. 9. Metoda eliminacji Gaussa. 10. Rozkład LU. 11. Metoda Gaussa-Crouta. 12. Metoda eliminacji Jordana. 13. Obliczanie wyznacznika metodą rozkładu LU. 14. Odwracanie macierzy przy użyciu rozkładu LU. 15. Metoda Jacobiego rozwiązywania układu równań liniowych. Algorytmy Przykłady algorytmów (3) 16. Metoda Gaussa-Seidela. 17. Rozkład QR macierzy metodą Grama-Schmidta. 18. Rozkład QR macierzy metodą Givensa. 19. Schemat Hornera obliczania wartości wielomianu. 20. Metoda relaksacyjna rozwiązywania układu równań liniowych. 21. Metoda Eulera rozwiązywania równań różniczkowych zwyczajnych. 22. Metoda Runge-Kutty rozwiązywania równań różniczkowych zwyczajnych. 23. Szybka transformacja Fouriera. Algorytmy Przykłady algorytmów (4) II. Algorytmy przeszukiwania zbiorów danych 1. Przeszukiwanie binarne. 2. Przeszukiwanie z funkcją mieszającą. III.Algorytmy przeszukiwania tekstów. 1. Algorytm typu brute-force. 2. Algorytm K-M-P (Knutha, Morrisa, Pratta). 3. Algorytm Boyera-Moore’a. 4. Algorytm Rabina-Karpa. Algorytmy Przykłady algorytmów (5) IV. Algorytmy grafowe 1. Algorytm Floyda-Warshalla ( domknięcie przechodnie grafu, algorytm pozwala stwierdzić, czy istnieje droga między dwoma wierzchołkami grafu). 2. Algorytm Dijkstry (poszukiwanie najkrótszej drogi w grafie). 3. Algorytmy przeszukiwania grafów ( wszerz, w głąb) V. Algorytmy kompresji danych 1. Kompresja przez modelowanie matematyczne. 2. Kompresja metodą RLE. 3. Kompresja danych metodą Huffmana. 4. Kompresja LZW. Algorytmy Przykłady algorytmów (6) VI. Algorytmy szyfrowania 1. Algorytm wymiany klucza Diffiego-Hellmana. 2. Algorytm RSA 3.Algorytm Rijndael. VII. Algorytmy teorioliczbowe (przykłady) 1. Obliczanie iloczynu Mongomery’ego 2. Potęgowanie modulo n (n nieparzyste) z użyciem iloczynu Mongomery’ego. 3. Chińskie twierdzenie o resztach. Algorytmy Przykłady algorytmów (7) VIII. Algorytmy sortowania. 1. Sortowanie przez zamianę ( ang. exchange sort) ( przykład: sortowanie przez prostą zamianę). 2. Sortowanie przez wybieranie (ang. selection sort) (przykład sortowanie przez proste wybieranie) 3. Sortowanie przez proste wstawianie. 4. Sortowanie szybkie (ang. quicksort). 5. Sortowanie przez kopcowanie (ang. heapsort). 6. Sortowanie przez scalanie( ang. mergesort). Algorytmy Sortowanie Sortowanie jest procesem ustawiania zbioru obiektów w określonym porządku. Sortowanie stosuje się w celu ułatwienia późniejszego wyszukiwania elementów sortowanego zbioru. Problem sortowania można sformułować następująco: Dane są obiekty a1 , a2 ,..., an Algorytmy Sortowanie (niemalejąco) polega na przestawianiu tych obiektów aż do chwili osiągnięcia uporządkowania ak1 , ak 2 ,..., ak3 takiego, że dla danej funkcji porządkującej f zachodzi związek: f (ak1 ) f (ak 2 ) ... f (ak3 ) Algorytmy Zwykle nie oblicza się wartości funkcji porządkującej, lecz przechowuje się je w jawnej postaci jako składowe każdego obiektu. Wartość tej funkcji nazywana jest kluczem obiektu. Dla tablic kluczem obiektu jest wartość elementu. Algorytmy Przykłady algorytmów (5) IV. Algorytmy sortowania. 1. Sortowanie przez zamianę ( ang. exchange sort) ( przykład: sortowanie przez prostą zamianę). 2. Sortowanie przez wybieranie (ang. selection sort) ( przykład sortowanie przez proste wybieranie) 3. Sortowanie przez proste wstawianie. 4. Sortowanie szybkie (ang. quicksort). 5. Sortowanie przez kopcowanie (ang. heapsort) 6. Sortowanie przez scalanie ( ang. merge sort) Algorytmy Sortowanie przez prostą zamianę ( sortowanie bąbelkowe) Metoda ta polega na porównywaniu w kolejnych przebiegach kluczy kolejnych sąsiadujących elementów (dla tablic wartości elementów tablicy) i ewentualnej zamianie miejscami tych elementów, jeżeli nie spełniają zadanej relacji. Po zakończeniu danego przebiegu następuje sprawdzenie czy nastąpiły w nim zamiany. Jeśli tak, realizowany jest kolejny przebieg, jeśli nie, to sortowanie zostało zakończone. Algorytmy Sortowanie przez prostą zamianę (sortowanie bąbelkowe) Przykład. Posortować niemalejąco tablicę 5-elementową zawierającą elementy 8,6,10,2,1. Pokazane zostaną poniżej stany tablicy w kolejnych przebiegach. I. przebieg 8,6,10,2,1 6,8,10,2,1 6,8,10,2,1 6,8,2,10,1 6,8,2,1,10 II. przebieg 6,8,2,1,10 6,8,2,1,10 6,2,8,1,10 6,2,1,8,10 6,2,1,8,10 III. przebieg IV. przebieg V. przebieg 6,2,1,8,10 2,1,6,8,10 1,2,6,8,10 2,6,1,8,10 1,2,6,8,10 1,2,6,8,10 2,1,6,8,10 1,2,6,8,10 1,2,6,8,10 2,1,6,8,10 1,2,6,8,10 1,2,6,8,10 2,1,6,8,10 1,2,6,8,10 1,2,6,8,10 Algorytmy Sortowanie przez prostą zamianę (bąbelkowe) #define N 5 // sortowanie niemalejąco #include <stdio.h> #include <conio.h> int main(int argc, char **argv) { int i, nr=1,p, zam; int a[5]={8,6,10,2,1}; do { zam=0; printf("\n przebieg nr=%d",nr++); for (i=0;i<N -1;i++) if (a[i+1]<a[i]) { p=a[i]; a[i]=a[i+1]; a[i+1]=p; zam=1; } } while (zam); printf("\n Stan tablicy po sortowaniu"); for (i=0;i<N;i++) printf("\n % d ",a[i]); getchar(); return 0;} Algorytmy Sortowanie przez proste wybieranie Metodę tę można opisać następująco:( sortowanie niemalejąco) - wybrać element o najmniejszym kluczu ( dla tablic element o najmniejszej wartości) - wymienić go z pierwszym elementem. Operacje te powtarza się z pozostałymi n-1 obiektami, następnie z n-2 obiektami, aż pozostanie jeden obiekt - największy. Algorytmy Przykład. Posortować niemalejąco przy użyciu algorytmu prostego wybierania tablicę 5- elementową przy użyciu zawierającą elementy 8,6,10,2,1. Pokazane zostaną poniżej kolejne stany tablicy w trakcie sortowania. 8 6 10 2 1 1 6 10 2 8 1 6 10 2 8 1 2 10 6 8 1 2 10 6 8 zamieniane elementy 10 i 6 1 2 10 6 8 stan po trzeciej zamianie 1 2 6 10 8 1 2 6 8 10 zamieniane elementy 8 i 1 stan po pierwszej zamianie zamieniane elementy 6 i 2 stan po drugiej zamianie zamieniane elementy 8 i 10 tablica posortowana Algorytmy // Sortowanie przez proste wybieranie #define N 5 #include <stdio.h> #include <conio.h> int main(int argc, char **argv) { int i,j,k,p,amin; int a[5]={8,6,10,2,1}; for (i=0;i<N;i++) { amin=a[i]; k=i; for (j=i+1;j<N-1;j++) if (a[j]<amin) { amin=a[j]; k=j; } if (k!=i) { p=a[i]; a[i]=a[k]; a[k]=p; } } printf("\n Stan tablicy po sortowaniu"); for (i=0;i<N;i++) printf("\n % d ",a[i]); getchar(); return 0;} Algorytmy Podstawowe własności algorytmów a) własność stopu b) poprawność Def. (poprawność algorytmu) Algorytm jest poprawny, gdy dla każdego egzemplarza problemu zatrzymuje się i daje poprawny wynik. c) stabilność numeryczna d) złożoność obliczeniowa Algorytmy Elementy analizy algorytmów Analiza algorytmu (analiza złożoności obliczeniowej) polega na określeniu zasobów, jakie są potrzebne do jego wykonania. Zasobami zasadniczymi są czas obliczeń i wielkość potrzebnej pamięci. Obecnie ważniejszym parametrem jest czas obliczeń. Zwykle rozpatruje się przypadek pesymistyczny dla czasu działania algorytmu. Algorytmy Pesymistyczny czas działania jest górną granicą możliwego czasu działania algorytmu dla każdych danych wejściowych. Znając ten czas, mamy gwarancję, że algorytm nie będzie działał dłużej (taki czas może często występować w praktyce, np. przy poszukiwaniu w bazie danych informacji, której tam nie ma) . Algorytmy Czas działania algorytmu może być opisany pewną funkcją np. t = f(n)=an2+bn +c, gdzie n reprezentuje rozmiar danych wejściowych. Można zauważyć, że dla dużych n znaczenie ma głównie pierwszy składnik. Przyjmując przykładowo a=1, b=1, c=1 n an2 bn c t 10 100 10 1 111 100 10000 100 1 10111 1000 1000000 1000 1 1001001 Algorytmy Pojawia się tutaj pojęcie rzędu wielkości funkcji. Rząd wielkości funkcji określa jak zmienia się składnik najbardziej istotny. Uważa się, że dany algorytm jest lepszy, jeśli jego pesymistyczny czas działania jest funkcją niższego rzędu. Algorytmy Przykład. Dla funkcji f(n) i czasu z poniższej tabeli wyznaczyć największy rozmiar problemu, który może być rozwiązany w czasie t, zakładając, że algorytm działa w ciągu f(n) mikrosekund. f(n) n log n 1 sek n n 1 min 1 dzień 1 miesiąc n log n n2 n3 2n n! Algorytmy Notacje asymptotyczne (1) Symbol Niech g:R* R* będzie funkcją rzeczywistą zmiennej n . Mówimy, że funkcja jest (g(n)), gdy istnieją stałe c1,,c2 R* i x0 R* takie, że c1 g(n) f(n)) c2 g(n) dla wszystkich n n0. Mówimy wówczas,że funkcje są tego samego rzędu. (log n) - logarytmiczna (n) - liniowa c1g(n) (n log n) logarytmiczno-liniowa f(n) c2g(n) (n2) - kwadratowa (2n) - wykładnicza n0 n Algorytmy Notacje asymptotyczne (2) Symbol O(·) Niech g:R* R* będzie funkcją rzeczywistą zmiennej n . Przez O(g) oznaczymy zbiór funkcji f:R* R*, takich, że dla pewnego c R* i x0 R* mamy f(n)) c g(n) dla wszystkich n n0. } Symbol O(g) czytamy " O duże od n", zaś o funkcji f mówimy, "że jest duże O od g" c1g(n) f(n) n Algorytmy Rząd złożoności obliczeniowej Klasa funkcji subliniowa wielomianowa niewielomianowa Typ funkcji Przykłady stała (e-nsin2n), (1/n) polilogarytmiczna (log log n), (log2n) liniowa (n),(n(1+n)n) quasi-liniowa (n log n),(n loglog n) kwadratowa (n2), (n/2) superwielomianowa (nlog n),() wykładnicza (2n), (n23n) superwykładnicza ( 2 ),(nn) n n Algorytmy Złożoność obliczeniowa a programowanie algorytmów Generalnie powinno się stosować algorytmy o możliwie najmniejszej złożoności obliczeniowej, lecz w praktyce powinno się też uwzględnić dodatkowe czynniki: 1. Gdy program będzie używany niewiele razy, to koszt napisania i uruchomienia programu jest większy od pozostałych kosztów. 2. Jeśli program będzie wykonywany na małych danych, istotna jest wielkość stałej proporcjonalności c. 3. Program nie powinien być skomplikowany ( o ile to możliwe), gdyż utrudnia to wprowadzanie zmian 4. Istnieją algorytmy o dużej złożoności dla najgorszego przypadku, a działające szybko dla przypadku przeciętnego. 5. Dla algorytmów działających na liczbach rzeczywistych są ważne dokładność, a także wrażliwość numeryczna. Żródło Kubale M. Łagodne wprowadzenie do algorytmów.