ZŁOŻONOŚĆ OBLICZENIOWA

Slides:



Advertisements
Podobne prezentacje
Katarzyna Szafrańska kl. II ti
Advertisements

STRUKTURY DANYCH.
Sortowanie przez scalanie
Rekurencja 1 Podprogram lub strukturę danych nazywamy rekurencyjną, (recursive subprogram, recursive data structure) jeżeli częściowo składa się z samej.
Grażyna Mirkowska PJWSTK 15 listopad 2000
Wykład 10 Metody Analizy Programów Specyfikacja Struktur Danych
PROGRAMOWANIE STRUKTURALNE
ALGORYTMY I STRUKTURY DANYCH
ALGORYTMY I STRUKTURY DANYCH
Współprogramy III Ten wykład ma na celu pokazanie kolejnej ciekawej możliwości, którą oferują współprogramy. Wspólprogramy reprezentujące wyrażenia regularne.
ALGORYTMY GEOMETRYCZNE.
Turbo pascal – instrukcje warunkowe, iteracyjne,…
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 7: Procedury i funkcje © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 6: Tablice, rekordy, zbiory.
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 5: Typy porządkowe, wyliczeniowe i okrojone. Definiowanie.
Rekurencja Copyright, 2000 © Jerzy R. Nawrocki Wprowadzenie do informatyki Wykład.
Imperatywne modele obliczeń Copyright, 2001 © Jerzy R. Nawrocki Wprowadzenie do.
Rekurencja Copyright, 2001 © Jerzy R. Nawrocki Wprowadzenie do informatyki Wykład.
Imperatywne modele obliczeń Copyright, 2003 © Jerzy R. Nawrocki Teoretyczne podstawy.
Programowanie imperatywne i granice obliczalności Copyright, 2004 © Jerzy R. Nawrocki
Rekursja Copyright, 2004 © Jerzy R. Nawrocki Teoretyczne podstawy informatyki.
Kurs Pascala – spis treści
Materiały pomocnicze do wykładu
Instrukcja skoku GO TO etykieta Np. GO TO 100 ….. 100WRITE (*,*) Przeskok do instrukcji 100 Uwaga! NIE WOLNO skakać do wnętrzna złożonych instrukcji warunkowych.
Rzędy wielkości funkcji
Wprowadzenie do programowania w języku Turbo Pascal
Typy wyrażenia, schematy blokowe, writeln, readln, if, pętle
Podprogramy.
Typy złożone, case, stałe. Typ zbiorowy type typ_zb = set of typ_podstawowy; Typem podstawowym może być tylko typ porządkowy. Typem podstawowym może być
Schemat Hornera Mgr inż. Michał Szucki.
POJĘCIE ALGORYTMU Pojęcie algorytmu Etapy rozwiązywania zadań
Algorytmy i struktury danych
PASCAL pętla WHILE.
Programowanie strukturalne i obiektowe
Pliki tekstowe. Operacje na plikach. mgr inż. Agata Pacek.
Andrzej Jędryczkowski Nie da się napisać większego programu bez podziału go na części zwane podprogramami. Podprogram to wyróżniona część programu.
Funkcje w Pascalu Przypomnienie wiadomości o procedurach Prowadzący: Anna Kaleta Piotr Chojnacki.
20 września 2003r. Centrum Kształcenia Ustawicznego im. St. Staszica w Koszalinie Wstęp do algorytmiki Autor: Marek Magiera.
© A. Jędryczkowski – 2006 r. © A. Jędryczkowski – 2006 r.
Ocena przydatności algorytmu – czas działania (złożoność czasowa)
Wyrażenia w Turbo Pascalu.
Algorytmy i struktury danych
Procedury i funkcje.
Definicja pliku tekstowego Operacje wykonywane na plikach tekstowych
Pliki Pojęcie i rodzaje plików Definicja typu plikowego Operacje wykonywane na plikach elementowych.
Pliki tekstowe – A. Jędryczkowski © 2007 Turbo Pascal umożliwia wykorzystanie w programach plików tekstowych. Pliki takie zawierają informację niezakodowaną
1 Wykład 8 Podprogramy. 2 Pojęcie i istota stosowania dzielenie programu na części (logicznie spójne) - nazwane - niezależne od pozostałych części - z.
Zbiory i rekordy mgr inż. Agata Pacek. Deklaracja typu zbiorowego (określa ilość elementów w zbiorze) type biegi=set of 0..6; Definiowanie zmiennej typu.
Programowanie strukturalne i obiektowe
Instrukcja warunkowa i wyboru
Początek, koniec lub przerwanie algorytmu
Informatyka MPZI Wykład 4 Podprogramy Pliki Typ zbiorowy Rekurencja.
Informatyka MZT1 Wykład 6 Iteracje while i repeat Tablice Rekordy
Źródła błędów w obliczeniach numerycznych
Wykład 10 typ zbiorowy rekurencja.
FUNKCJE Opracował: Karol Kara.
Ogólna struktura programu w TP
Informatyka 2 MPDI Wykład 9 Delphi tablice, rekordy.
Algorytmika Iteracje autor: Tadeusz Lachawiec.
Zagadnienia AI wykład 6.
opracowała: Anna Mikuć
WYKŁAD 06 Programowanie dynamiczne Grażyna Mirkowska.
Podstawowe struktury danych. Typy danych.
Wstęp do programowania Wykład 4
P ASCAL Definicje, deklaracje, podstawowe instrukcje 1.
Wykład 1 Informatyka II MPZI2 sem.letni. Tablice Tablice deklarujemy array [ lista typów indeksów ] of typ bazowy (składowych) np. var t1,t2:array [1..5,
Dane, zmienne, instrukcje
POJĘCIE ALGORYTMU Wstęp do informatyki Pojęcie algorytmu
Zapis prezentacji:

ZŁOŻONOŚĆ OBLICZENIOWA ALGORYTMÓW

pesymistyczna czasowa średnia Złożoność pamięciowa

DANE Wyznacz największą spośród 3 liczb rzeczywistych. D = { ( x, y, z ) : x,y,z  R } = R  R  R = R3 Oblicz 2n , dla pewnej liczby naturalnej n. D = { n : n  N } = N Sprawdź czy dana liczba naturalna n jest liczbą pierwszą. D = { n : n  N } = N Wyznacz największy wspólny dzielnik dwóch liczb naturalnych. D = { (a,b) : a,b  N } = N  N = N2

Oblicz sumę płac pracowników w firmie. D = { ( n, p1, ... ,pn ) : n  N , p1, ... ,pn  R } Wyznacz maksimum z ciągu liczb rzeczywistych. D = { ( n, x1, ... , xn ) : n  N , x1, ... , xn  R } Oblicz iloczyn dwóch wektorów x, y o współrzędnych rzeczywistych. D = {( n, x1, ... , xn, y1, ... ,yn ) : n  N , x1, ... , xn , y1, ... ,yn  R }

Zbiór operacji jednostkowych Pascala (J) : operatory arytmetyczne : + - * / div mod operatory logiczne : and or not operatory relacyjne : < <= > >= = <> nadanie wartości zmiennej typu prostego obliczenie wartości zmiennej indeksowanej inicjalizacja wywołania procedury lub funkcji przekazanie wartości parametru aktualnego wykonanie instrukcji pustej, wejścia lub wyjścia

PEŁNA FUNKCJA ZŁOŻONOŚCI CZASOWEJ Dany jest program P w Pascalu o zbiorze danych D. Zakładamy, że : P jest poprawny obliczenie programu P na każdej danej z D jest skończone Definiujemy funkcję t : D  N następująco : t(d) = ilość operacji ze zbioru J występujących w obliczeniu programu P na danej d  D t - pełna funkcja złożoności czasowej programu P pełna funkcja kosztu programu P

PRZYKŁADY Wyznacz maksimum z dwóch liczb rzeczywistych x, y. D = { ( x,y ) : x,y  real } program max2; t(d) var x,y : real; Max : real; begin read (x,y); 2 if x > y then Max := x 2 lub 1 else Max := y 0 lub 1 writeln (Max) 1 end. t(d) = 5

Wyznacz pierwiastki rzeczywiste równania kwadratowego ax2 + bx + c = 0 . D = { (a, b, c) : a,b,c  real } = real 3

if delta = 0 then 1 t(d) = 25 lub t(d) = 16 lub t(d) = 12 program pierwiastki; t(d) var a,b,c,delta, x1,x2 : real; begin read (a,b,c); 3 delta := b*b - 4*a*c; 5 if delta > 0 then 1 delta := sqrt(delta); 2 x1 := (-b + delta) / (2*a); 5 x2 := (-b - delta) / (2*a); 5 write (x1, x2) 2 end; if delta = 0 then 1 x1 := -b/(2*a); 4 write (x1); 1 if delta < 0 then write(‘Nie ma pierwiastków rzecz') 1 lub 2 end. t(d) = 25 lub t(d) = 16 lub t(d) = 12

Oblicz n! dla n>= 0. D = { n : n  byte } program silnia; t(d) var n : Byte ; silnia : LongInt ; begin readln (n); 1 if ( n = 0) or (n = 1) 3 then silnia := 1 1 else begin silnia := 1; 1 for i := 2 to n do 1 * (n-1) silnia := silnia * i ; 2 * (n-1) end; writeln (n); 1 end. t(n) = 1+3+1=5 dla n=0 lub n=1 t(n) = 1+3+1+(n-1)+2*(n-1)+1 = 3n + 3 dla n>1

Sprawdź czy liczba naturalna n, n >= 0, jest liczbą pierwszą . D = { n : n  word } program pierwsza; t(d) var n, p : word; b : boolean; begin readln (n); 1 p := 2; 1 b := true; 1 while ( (p*p <= n) and b) do  3*n if n mod p = 0 then b := false;  2*(n -1)+1 p := p + 1;  2*(n -1) end; if b then writeln (‘To jest liczba pierwsza’) 1 else writeln (‘ To nie jest liczba pierwsza’); 1 end. t(n)  7n + 1

n jest liczbą parzystą , tzn .: n mod 2 = 0 t(n) = 15 n jest postaci 3*k dla pewnego k N t(n) = 22 n jest liczbą pierwszą t(n) = 7n

ROZMIAR DANYCH Dowolną funkcje r : D  W nazywamy rozmiarem danych . Oblicz sumę płac pracowników w firmie. D = { ( n, p1, ... ,pn ) : n  N , p1, ... ,pn  R } W = { n : n  N } = N Wyznacz maksimum z ciągu liczb rzeczywistych. D = { ( n, x1, ... , xn ) : n  N , x1, ... , xn  R } W = { n : n  N } = N Oblicz iloczyn dwóch macierzy An,k , Bk,m, o wyrazach rzeczywistych D = {( n, k, m, A, B ) : n,k,m  N , A Macn,k(R), B  Mack,m(R) } W = {(n, k, m) : n,k,m  N} = N3 lub W = { n : n = max {n,k,m} } = N

PESYMISTYCZNA ZŁOŻONOŚĆ CZASOWA J - zbiór operacji jednostkowych Pascala (niekoniecznie wszystkich) P - program w Pascalu D - zbiór danych programu P W - zbiór rozmiarów danych programu P t - pełna funkcja złożoności czasowej programu P Funkcję T: W - -  N zdefiniowaną następująco : T(w) = sup { t(d) : d D ^ r(d) = w } nazywamy pesymistyczną złożonością czasową programu

Oznaczenie : f(n) = O(g(n)) NOTACJA "O" Niech g : N  R . O(g) = { f : N  R : istnieją stałe : c  R, c > 0 i n0  N takie, że |f(n)|  c * |g(n)| dla wszystkich naturalnych n  n0 } Dane są dwie funkcje f, g : N  R . Mówimy, że „ funkcja f jest co najwyżej rzędu funkcji g „ jeśli f  O(g) . Oznaczenie : f(n) = O(g(n))

Oznaczenie : f(n) = W (g(n)) NOTACJA " W " Niech g : N  R . W (g) = { f : N  R : istnieją stałe : c  R, c > 0 i n0  N , n > 0 takie, że |f(n)|  c * |g(n)| dla wszystkich naturalnych n  n0 } Dane są dwie funkcje f, g : N  R . Mówimy, że „ funkcja f jest co najmniej rzędu funkcji g „ jeśli f  W (g) . Oznaczenie : f(n) = W (g(n))

Oznaczenie : f(n) = Q (g(n)) NOTACJA " Q " Niech g : N  R Q(g) = O(g) Ç W (g) Dane są dwie funkcje f, g : N  R . Mówimy, że „ funkcja f jest dokładnie rzędu funkcji g „ jeśli f  Q (g) . Oznaczenie : f(n) = Q (g(n))

WŁASNOŚCI NOTACJI "O" " ( k > 0) kf = O( f ) nr = O( ns) jeśli 0  r  s Jeśli f = O(g), to f + g = O(g) Jeśli f jest wielomianem stopnia d, to f = O(nd)

Jeśli f = O(g) i g = O(h) , to f =O(h) Jeśli f = O(g) i h =O(r) , to fh = O( gr ) " (b > 1 and k ³ 0) nk = O( bn ) Przykład : n20 = O( 1.05n) "(b > 1 and k > 0) logbn = O( nk) Przykład: log2n = O( n0.5)

"( b, d > 1) logbn =O(logdn) S kr = Q ( nr+1 ) k=1

PODSUMOWANIE Dla algorytmu A i zbioru operacji J : znajdujemy funkcję g : W  R , gdzie W jest zbiorem rozmiaru danych i rzeczywistą stałą c > 0 taką, że TA,J,W (w)  c * |g(w)| dla prawie wszystkich w  W, Wtedy piszemy T(w) = O(g(w)) ( „T jest co najwyżej rzędu g” ) lub T = O(g)

D = { ( n, p1, ... ,pn ) : n  byte , p1, ... ,pn  real W = { n : n  byte} program suma; const ile = 100; var p : array [1..ile] of real; n : byte; s : real; begin read (n); 1 s := 0; 1 for i := 1 to n do n read (p[i]); 2n s := s + p[i]; 3n end; writeln (s) 1 end. 6n + 3 <= 7n dla n >2 T(n) = O(n)

Sprawdź czy liczba naturalna n, n >= 0, jest liczbą pierwszą . D = { n : n  word } program pierwsza; t(d) var n, p : word; b : boolean; begin readln (n); 1 p := 2; 1 b := true; 1 while ( (p*p <= n) and b) do  3*n if n mod p = 0 then b := false;  2*(n -1)+1 p := p + 1;  2*(n -1) end; if b then writeln (‘To jest liczba pierwsza’) 1 else writeln (‘ To nie jest liczba pierwsza’); 1 end. t(n)  7n + 1 T(n) = O(n )

NA KONIEC Po co złożoność : Dobry algorytm jest jak „ostry nóż” - robi dokładnie to, co ma robić, z najmniejszym wysiłkiem. Używanie złego algorytmu to jak „krajanie steku korkociągiem”. Rezultat może nie być ani efektywny ani „apetyczny”.

ZADANIE. Posortuj tablicę zawierającą milion liczb (106) .

Superkomputer : wykonuje 100 milionów (108) operacji na sekundę. Sortujemy algorytmem przez wstawianie : T(n) = 2n2 T(106) = 2 * (106)2 / 108 = 20 000 sekund  5.56 godzin Komputer osobisty : wykonuje 1 milion (106) operacji na sekundę Sortujemy algorytmem przez scalanie : T(n) = 50nlgn T(106) = 50 * 106 * lg106 / 106  1000 sekund  16.67 minut Komputer osobisty wykonał zadanie 20 razy szybciej. UWAGA : Sortowanie przez wstawianie jest szybsze od sortowania przez scalanie dla małych n