Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 4 WSTĘP DO INFORMATYKI

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

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

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Złożoność problemów. 1 ruch na sekundę czas wykonania ok lat 1 mln ruchów na sekundę czas wykonania ok.

PROBLEMY NIEROZSTRZYGALNE

Efektywność Procedur Obliczeniowych. wykład 5

Struktura danych. Sposób uporządkowania informacji w komputerze.

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

Wprowadzenie do złożoności obliczeniowej

Struktury danych i złożoność obliczeniowa Wykład 5. Prof. dr hab. inż. Jan Magott

Podstawy Informatyki. Sprawność algorytmów

Technologie cyfrowe. Artur Kalinowski. Zakład Cząstek i Oddziaływań Fundamentalnych Pasteura 5, pokój 4.15

Obliczenia inspirowane Naturą

Struktury danych i złożoność obliczeniowa Wykład 7. Prof. dr hab. inż. Jan Magott

Informatyka 1. Złożoność obliczeniowa

Efektywność algorytmów

Algorytm. a programowanie -

Teoria obliczeń i złożoność obliczeniowa

Wstęp do programowania

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

TEORETYCZNE PODSTAWY INFORMATYKI

Algorytmy Równoległe i Rozproszone Część X - Algorytmy samostabilizujące.

Hierarchia Chomsky ego Maszyna Turinga

Podstawy Informatyki Maszyna Turinga

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Definicje. Algorytm to:

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

Elementy Teorii Obliczeń

MASZYNA TURINGA UPRASZCZANIE DANYCH

O ALGORYTMACH I MASZYNACH TURINGA

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Maszyna Turinga języki

Struktury danych i złozoność obliczeniowa. Prof. dr hab. inż. Jan Magott

Algorytm. Krótka historia algorytmów

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

Maszyna Turinga Złożoność obliczeniowa

Podstawy Programowania. Złożoność obliczeniowa

INFORMATYKA SORTOWANIE DANYCH.

Matematyczne Podstawy Informatyki

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

Zaawansowane algorytmy i struktury danych

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

Programowanie komputerów

Struktury danych i złożoność obliczeniowa Wykład 6. Prof. dr hab. inż. Jan Magott

Obliczenia inspirowane Naturą

Języki, automaty i obliczenia

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Matematyczne Podstawy Informatyki

Algorytmika i pseudoprogramowanie

Maszyna Turinga. Algorytm. czy program???? Problem Hilberta: Przykłady algorytmów. Cechy algorytmu: Pojęcie algorytmu

Lista 6 Problemy NP-zupełne

Logiczny model komputera i działanie procesora. Część 1.

Technologie informacyjne - wykład 12 -

Języki programowania zasady ich tworzenia

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

Alan M. TURING. Matematyk u progu współczesnej informatyki

Podstawy Programowania

Wstęp do informatyki. Maszyna RAM. Schemat logiczny komputera. Maszyna RAM. RAM: szczegóły. Realizacja algorytmu przez komputer

Maszyna Turinga (Algorytmy Część III)

Informacja w perspektywie obliczeniowej. Informacje, liczby i obliczenia

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

Podstawy Programowania. Złożoność obliczeniowa

Zasady analizy algorytmów

Podstawy Programowania Algorytmy i programowanie

Przykład: Σ = {0, 1} Σ - zbiór wszystkich skończonych ciagów binarnych. L 1 = {0, 00, 000,...,1, 11, 111,... } L 2 = {01, 1010, 001, 11}

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 9 Rekurencja

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

Poprawność algorytmów

O ISTOTNYCH OGRANICZENIACH METODY

Imię, nazwisko, nr indeksu

ZLOŻONOŚĆ OBLICZENIOWA - WYK. 2

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

Poprawność semantyczna

Wykład z Technologii Informacyjnych. Piotr Mika

1. Analiza algorytmów przypomnienie

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

Podstawy Informatyki Systemy sterowane przepływem argumentów

Język ludzki kod maszynowy

ALGORYTMY I PROGRAMY

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 1 WSTĘP DO INFORMATYKI

Algorytmy. Programowanie Proceduralne 1

Informatyka. Michał Rad

1 Wprowadzenie do algorytmiki

Programowanie dynamiczne cz. 2

Maszyna Turinga, ang. Turing Machine (TM)

Języki i metodyka programowania

TEORETYCZNE PODSTAWY INFORMATYKI

Metoda tabel semantycznych. Dedukcja drogi Watsonie, dedukcja... Definicja logicznej konsekwencji. Logika obliczeniowa.

Sprzęt komputera - zespół układów wykonujących programy wprowadzone do pamięci komputera (ang. hardware) Oprogramowanie komputera - zespół programów

Złożoność obliczeniowa. wykład 1

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

Wprowadzenie do algorytmiki

Podstawy programowania

Teoretyczne podstawy informatyki

Programowanie w języku C++ Grażyna Koba

Algorytm i złożoność obliczeniowa algorytmu

KATEDRA INFORMATYKI TECHNICZNEJ. Ćwiczenia laboratoryjne z Logiki Układów Cyfrowych. ćwiczenie 204

Algorytmy. Programowanie Proceduralne 1

Transkrypt:

Dr inż. Grażyna KRUPIŃSKA Grazyna.Krupinska@fis.agh.edu.pl D-10 pokój 227 WYKŁAD 4 WSTĘP DO INFORMATYKI

Podprogramy 2 Mówiąc o podprogramach będziemy zakładali : każdy podprogram posiada jeden punkt wejścia; program wywołujący podprogram zostaje zawieszony na czas działania podprogramu; sterowanie zawsze powraca do programu wywołującego w momencie zakończenia działania podprogramu.

3 Program NWD; dane wejściowe: a, b; dopóki b > 0 wykonuj; wywołaj podprogram mod(a,b) podstaw wynik do c; (c mod (a,b)) podstaw za a liczbę b; podstaw za b liczbę c; podstaw za rezultat liczbę a; rezultat: rezultat; podprogram mod(m,n); podstaw za i liczbę 0; dopóki i *n m wykonuj; podstaw za j wartość m (i * n); powiększ i o liczbę 1; podstaw za reszta liczbę j; rezultat: reszta;

Podprogramy start wczytaj a, b a, b start n n a m m b b>0 NIE wypisz a i*n m NIE j TAK stop TAK stop c mod (a,b) j m-(n*i) a b b c j i i+1

Podprogramy start wczytaj a, b a, b start n n a m m b b>0 NIE wypisz a i*n m NIE j TAK stop TAK stop c mod (a,b) j m-(n*i) a b b c j i i+1

Podprogramy 6 Przekazywanie parametrów odbywa się za pośrednictwem stosu tak jest w zdecydowanej większości języków programowania. Przekazywanie przez wartość i/lub wynik jest realizowane poprzez kopiowanie wartości na stos/ze stosu. Odpowiednia komórka pamięci na stosie jest alokowana w chwili wywołania podprogramu. W trakcie działania podprogramu funkcjonuje ona jako zmienna lokalna. Przekazywanie przez referencję jest realizowane poprzez umieszczenie odpowiedniego adresu na stosie. Jeśli parametr aktualny jest stałą (a w szczególności literałem, np. abc, 12.34), to na stosie trzeba umieścić jej adres. Kompilator nie może pozwolić, by parametr taki był zmieniany. Jeśli parametr aktualny jest wyrażeniem, na stosie trzeba umieścić adres komórki pamięci z wynikiem wyrażenia.

Rekurencja 7 Zdolność podprogramu do wywołania samego siebie. Procedura silnia(n); jeżeli n = 0 to zwróć 1 ; w przeciwnym razie zwróć rezultat wywołania silnia(n-1) pomnożony przez n; koniec procedury; 4! = 3! 4 = 2! 3 4 = 1! 2 3 4 = 0! 1 2 3 4 = 1 1 2 3 4 = 24

Podprogramy start start start n n n n-1 n n n-2 NIE n<>0 1 n-1 NIE n<>0 1 n-1 NIE n<>0 1 TAK stop TAK stop TAK stop wynik n * SILNIA (n-1) wynik n * SILNIA (n-1) wynik n * SILNIA (n-1) wynik (n-1)! wynik (n-2)! wynik stop stop stop

9 Rekyrencja Cechy algorytmów rekurencyjnych: zakończenie algorytmu jest jasno określone złożony problem zostaje rozłożony na problem elementarny, który umiemy rozwiązać, i na problem o mniejszym stopniu komplikacji, niż ten z którym mieliśmy do czynienia na początku Podstawowe błędy przy konstruowaniu programów rekurencyjnych: złe określenie warunku zakończenia programu niewłaściwa, nieefektywna metoda rozwiązania problemu

10 Język programowania Język programowania jest środkiem pozwalającym na zapis algorytmów w postaci zrozumiałej dla człowieka, a równocześnie przetwarzalnej do postaci zrozumiałej dla komputera.

Języki programowania 11 Języki wysokiego poziomu posługują się rozbudowaną składnią zbliżoną do języka naturalnego; czytelne dla programisty. Języki niskiego poziomu (asemblery) posługują się składnią zbliżoną do elementarnych operacji procesora i adresów symbolicznych reprezentujących jego rejestry; łatwo przekształcalne do kodu maszynowego.

Proces tworzenia programu 12 Pomysł Algorytm Programowanie Program wysokiego poziomu Kompilacja Program w języku maszynowym Wykonanie przez komputer

Programowanie 13 Proces przekształcenia oryginalnego pomysłu na algorytm, a następnie zapisanie algorytmu przez programistę w języku wysokiego poziomu (tzw. kodowanie).

Kompilacja 14 Proces przekształcania programu zapisanego w języku wysokiego poziomu na postać kodu maszynowego nadającego się do wykonania przez komputer (procesor). Program wykonujący proces kompilacji nazywany jest kompilatorem; specyficzny dla danego języka programowania.

Konsolidacje (linkowanie) 15 Proces łączenia w jedną całość wcześniej skompilowanych fragmentów źródłowych np. podprogramów w celu uzyskania ostatecznej (monolitycznej) postaci kompletnego kodu wykonywalnego. Przechowywane w skompilowanej postaci uniwersalne podprogramy (realizujące np. zaawansowane operacje matematyczne, graficzne) nazywamy bibliotekami (libraries).

Debugging 16 Proces wykrywania i usuwania błędów w działaniu skompilowanego programu poprzez śledzenie (krok po kroku) przebiegu wykonania instrukcji języka wysokiego poziomu. Realizowane za pomocą narzędzia (programu) zwanego debugger em (odpluskwiaczem). Wymaga zwykle specjalnego trybu kompilacji (dołączenia informacji symbolicznej do kodu).

18 Interpretacja Sposób wykonania programu polegający na przekształcaniu kolejnych instrukcji języka wysokiego poziomu na kod maszynowy na bieżąco w czasie egzekucji programu. Program wykonawczy zwany jest interpreterem. Interpretacja jest prostsza w realizacji, ale charakteryzuje się znacznie niższą efektywnością od wykonania programu skompilowanego; np. w pętlach te same instrukcje są wielokrotnie przekształcane do postaci kodu maszynowego.

19 Interpretacja

Kompilacja a interpretacja 20 Interpretacja program w postaci kodu źródłowego wolniejsze możliwość zmiany kodu przez użytkownika przenaszalność Kompilacja program w kodzie maszynowym duża wydajność

Wstępna kompilacja, przyśpiesza późniejszą interpretację, zatem języki te są szybsze od interpretowanych Funkcje z bibliotek podobnie jak w przypadku języków interpretowanych są dołączone w czasie wykonania. Języki prekompilowane (VM) 21 Prekompilacja powstanie kodu pośredniego ( Byte-code, B-Code) Uruchamianie programu wstępnie skompilowanego na pewnej maszynie wirtualnej (ang. virtual machine,vm). Maszyna wirtualna interpretuje program i wykonuje go na konkretnej platformie sprzętowo - systemowej. Użytkownik otrzymuje finalny program, a jednocześnie jest on przenaszalny i będzie funkcjonował wszędzie tam gdzie posiadamy VM dla tego języka.

22

Potencjał maszyn 23 algorytmicznych Maszyna Turinga Teza Churcha-Turinga Miara złożoności obliczeniowej Klasy złożoności obliczeniowej

Maszyna Turinga 24 Abstrakcyjne urządzenie algorytmiczne zaproponowane przez Alana Turinga w 1936 roku. Maszyna Turinga zbudowana jest z trzech głównych elementów: jednostka sterująca zdolna odczytywać/ zapisywać symbole za pomocą głowicy; obustronnie nieskończona taśma zawierająca symbole ze skończonego zbioru; skończony zestaw stanów, w których może znajdować się maszyna w trakcie procesu obliczania (w tym stan początkowy (start) i końcowy (halt)).

25 Taśma Symbole stanowią odpowiednik danych wejściowych. Maszyna Turinga odczytuje dane z kolejnych komórek i przetwarza na inne symbole, czyli dane wyjściowe. Wyniki obliczeń zapisywane są w komórkach taśmy. Nieskończona taśma jest odpowiednikiem współczesnej pamięci komputera. Taśma dzieli się na komórki, w których umieszczone zostały symbole, czyli znaki przetwarzane przez maszynę Turinga.

Głowica zapisująco - odczytująca 26 Głowica zapisująco-odczytująca, odpowiada funkcjonalnie urządzeniom wejścia/wyjścia współczesnych komputerów lub układom odczytu i zapisu pamięci. Głowica zawsze znajduje się nad jedną z komórek taśmy. Może ona odczytywać zawartość tej komórki oraz zapisywać do niej inny symbol - na tej zasadzie odbywa się przetwarzanie danych z jednych symboli otrzymujemy inne.

27 Głowica zapisująco - odczytująca Oprócz odczytywania i zapisywania symboli w komórkach głowica wykonuje ruchy w prawo i w lewo do sąsiednich komórek na taśmie. W ten sposób może się ona przemieścić do dowolnie wybranej komórki taśmy. Przed rozpoczęciem pracy maszyny Turinga głowica jest zawsze ustawiana nad komórką taśmy zawierającą pierwszy symbol do przetworzenia.

28 Układ sterowania Układ sterowania głowicą jest odpowiednikiem procesora komputera. Układ ten odczytuje za pomocą głowicy symbole z komórek taśmy oraz przesyła do głowicy symbole do zapisu w komórkach. Dodatkowo nakazuje on głowicy przemieścić się do sąsiedniej komórki w lewo lub w prawo.

29 Działanie Maszyny Turinga Podstawą działania Maszyny Turinga są stany układu sterowania. Stan układu sterowania określa jednoznacznie jaką operację wykona Maszyna Turinga, gdy odczyta z taśmy określony symbol. Operacje wykonywane przez układ sterowania zależą od dwóch czynników: symbolu odczytanego z komórki na taśmie bieżącego stanu układu sterującego

30 Działanie Maszyny Turinga Stany MT będziemy określać kolejnymi nazwami: q 0, q 1, q 2,...,q n q 0 jest stanem początkowym, w którym znajduje się maszyna Turinga przed rozpoczęciem przetwarzania symboli na taśmie.

31 Działanie Maszyny Turinga Instrukcja dla Maszyny Turinga (S 0, q i, S z, q j, L/R) S 0 symbol odczytany przez głowicę z bieżącej komórki na taśmie q i bieżący stan układu sterowania S z symbol, jaki zostanie zapisany w bieżącej komórce na taśmie q j nowy stan, w który przejdzie układ sterowania po wykonaniu operacji L/R ruch głowicy o jedną komórkę w lewo (L) lub prawo (R)

Działanie Maszyny Turinga 32 (S 0, q i, S z, q j, L/R ) część identyfikująca część operacyjna tyle różnych instrukcji, ile zdefiniujemy różnych części identyfikacyjnych w programie nie może być dwóch różnych instrukcji o identycznej części identyfikacyjnej części operacyjne różnych instrukcji mogą być takie same

Działanie Maszyny Turinga 33 (S 0, q i, S z, q j, L/R ) Mamy dwie instrukcje (0, q 0, 1, q 0, L) (1, q 0, 0, q 0, L) Załóżmy, iż taśma zawiera następujący ciąg symboli : * 1 0 1 1 0 * symbol pusty dane do przetworzenia

Działanie Maszyny Turinga 34 (0, q 0, 1, q 0, L) (1, q 0, 0, q 0, L) * 1 0 1 1 0 * * 1 0 1 1 0 * 0 q 0 1 q 0 L * 1 0 1 1 1 * 1 q 0 0 q 0 L * 1 0 1 0 1 * 1 q 0 0 q 0 L * 1 0 0 0 1 * 0 q 0 1 q 0 L * 1 1 0 0 1 * 1 q 0 0 q 0 L * 0 1 0 0 1 * * q 0 Instrukcja niezdefiniowana. Maszyna zatrzymuje się

35 Działanie Maszyny Turinga Początkowy stan taśmy : * 1 0 1 1 0 * Końcowy stan : * 0 1 0 0 1 * Podany program dokonuje binarnej negacji bitów wejściowych.

Maszyna Turinga może być traktowana jak komputer z ustalonym programem (jest nim diagram przejść), gdzie dane znajdują się na taśmie. Działanie Maszyny Turinga Ponieważ diagram przejść może być dowolny, a każdą, nawet najbardziej skomplikowaną 36 strukturę danych da się przedstawić w postaci jednowymiarowego ciągu symboli, maszyna Turinga jest automatem uniwersalnym, zdolnym wykonać każde obliczalne zadanie. Diagramu przejść jest grafem skierowanym, którego wierzchołki reprezentują stany. HALT RETURN OVER- FLOW START NO CARRY ADD CARRY Krawędź prowadząca ze stanu S 1 do stanu S 2 nazywa się przejściem (A, B, D ) etykieta przejścia A, B symbole stanów D to kierunek - "w prawo" lub "w lewo" Kilka wyróżnionych stanów maszyny: stan początkowy, stan końcowy jeden lub kilka

Działanie Maszyny Turinga 37 Maszyna wykonująca inkrementację liczby binarnej (alfabet:1,0,*) HALT RETURN OVER- FLOW START NO CARRY ADD CARRY stan: komórka: nowa: ruch: nowy-stan: START * * lewo ADD ADD 0 1 lewo NO CARRY ADD 1 0 lewo CARRY ADD * * prawo HALT CARRY 0 1 lewo NO CARRY CARRY 1 0 lewo CARRY CARRY * * lewo OVERFLOW NO CARRY 0 0 lewo NO CARRY NO CARRY 1 1 lewo NO CARRY NO CARRY * * prawo RETURN OVERFLOW (any) 1 prawo RETURN RETURN 1 1 prawo RETURN RETURN 0 0 prawo RETURN RETURN * * brak HALT Jednostka sterująca * 1 0 1 *

* 1 0 1 * START ADD CARRY * 1 0 1 * * 1 0 0 * * 1 1 0 * NO CARRY NO CARRY * 1 1 0 * * 1 1 0 * RETURN stan: komórka: nowa: ruch: nowy-stan: 14.11.2016 START * * lewo ADD ADD 0 1 lewo NO CARRY ADD 1 0 lewo CARRY ADD * * prawo HALT CARRY 0 1 lewo NO CARRY CARRY 1 0 lewo CARRY CARRY * * lewo OVERFLOW NO CARRY 0 0 lewo NO CARRY NO CARRY 1 1 lewo NO CARRY NO CARRY * * prawo RETURN OVERFLOW (any) 1 prawo RETURN RETURN 1 1 prawo RETURN RETURN 0 0 prawo RETURN RETURN * * brak HALT * 1 1 0 * RETURN * 1 1 0 * RETURN * 1 1 0 * RETURN * 1 1 0 * HALT 38

Działanie Maszyny Turinga 39 0, q 0, 0, q 0, L stan początkowy, zapamiętujemy 0 1, q 0, 0, q 1, L stan początkowy, zapamiętujemy 1 0, q 1, 1, q 0, L zapisujemy zapamiętane 1, zapamiętujemy 0 1, q 1, 1, q 1, L zapisujemy zapamiętane 1, zapamiętujemy 1?, q 0, 0, q 2, L koniec, zapisujemy zapamiętane 0?, q 1, 1, q 2, L koniec, zapisujemy zapamiętane 1

Zastosowania Maszyny Turinga 40 Przetwarzacz oblicza wartość funkcji dane wejściowe to początkowy stan napisu na taśmie, a wynik jest końcowym stanem taśmy w momencie zatrzymania. Gdy maszyna nie zatrzyma się to funkcja nie jest określona dla tych danych (funkcja niezupełna). Akceptant posiada 2 stany końcowe q a ="akceptuj", q r ="odrzuć Generator języka rozpoczyna pracę od pustej taśmy i zapisuje na niej słowa danego języka, dla którego został zaprojektowany.

Zastosowania Maszyny Turinga 41 Obliczanie funkcji proces wyznaczania danych wyjściowych na podstawie danych wejściowych tabela relacji dane-wyniki; algorytm przejścia od danych do wyników (funkcje obliczalne). Funkcje obliczalne przez maszynę Turinga jeśli maszyna przekształca dane umieszczone na taśmie na wyniki zapisane na taśmie w momencie zatrzymania maszyny

42 Teza Churcha-Turinga Różnorodność zadań stawianych przed maszyną Turinga postawiło pytanie: Jakie problemy można rozwiązać odpowiednio zaprogramowaną maszyną Turinga? (oczywiście pomijając czas) Każdą funkcję, którą da się efektywnie obliczać, da się obliczać używając maszyny Turinga. Teza Churcha-Turinga nie jest twierdzeniem (nie może być dowiedziona w matematycznym rozumieniu dowodzenia) nieprecyzyjne pojęcie efektywnej obliczalności.

43 Teza Churcha-Turinga Proponowano różne modele komputera absolutnego, wszechpotężnego, lub uniwersalnego, aby sprecyzować ulotne pojęcie efektywnej obliczalności. Turing zaproponował swoją maszynę, Church wymyślił matematyczny formalizm funkcji zwany rachunkiem lambda (jako podstawa języka programowania Lisp). Emil Post zdefiniował pewien typ systemu produkcji do manipulowania symbolami, Stephen Kleene zdefiniował klasę obiektów zwanych funkcjami rekurencyjnymi. Wszyscy Wszystkie oni te próbowali modele użyć są równoważne tych modeli do w rozwiązania kategoriach wielu problemów algorytmicznych, do których znane były problemów efektywnie wykonalne algorytmicznych, algorytmy. które rozwiązują.

44 Złożoność obliczeniowa algorytmów Złożoność obliczeniowa jest podstawową własnością określaną dla algorytmów. Zadaniem analizy algorytmu jest określenie tej złożoności, a co za tym idzie realizowalności algorytmu. Złożoność zasobowa (pamięciowa) - wyrażana w skali zajętości zasobów (PAO, pamięci zewnętrznych itp.) niezbędnych dla realizacji algorytmu Złożoność czasowa - wyrażana w skali czasu wykonania algorytmu (liczba kroków, aproksymowany czas rzeczywisty).

Złożoność obliczeniowa 45 algorytmów Złożoność obliczeniowa nie zależy od architektury i konfiguracji sprzętowej komputerów (wyznaczamy ją dla maszyny z pamięcią o dostępie swobodnym), ale zależy od rozmiaru i uporządkowania danych wejściowych. Wyznaczając złożoność obliczeniową algorytmu badamy trzy przypadki: optymistyczny pesymistyczny średni

Maszyna wzorcowa 46 Chcąc wyznaczyć efektywność działania algorytmu niezależnie od języka programowania, ani sprzętu na którym zostanie on zrealizowany, należy przyjąć jakąś maszynę wzorcową, która będzie wykonywała ten algorytm. maszyna Turinga maszyna RAM).

Maszyna wzorcowa 47 maszyna Turinga jest prosty koncepcyjnie. potrafi przeprowadzić dowolne obliczenie możliwe na innych znanych nam maszynach. zużycie zasobów podczas obliczenia dobrze modeluje rzeczywiste komputery. maszyna RAM abstrakcyjny, jednoprocesorowy komputer, nieograniczona pamięć o dostępie swobodnym odwołanie do dowolnej komórki realizowane w takim samym czasie, niezależnie od jej położenia; procesor ma krótką listę rozkazów, z których każdy jest zawsze wykonywany w takim samym czasie jak pozostałe.

48 Złożoność obliczeniowa algorytmów Przypadek optymistyczny - zakładamy takie wstępne uporządkowanie danych wejściowych, że algorytm jest wykonywany najszybciej i wymaga najmniej pamięci do swojego działania. Przypadek pesymistyczny - zakładamy takie wstępne uporządkowanie danych wejściowych, że algorytm jest wykonywany najwolniej i wymaga najwięcej pamięci do swojego działania. Przypadek średni - badamy zapotrzebowanie algorytmu na pamięć i czas procesora dla najczęściej spotykanych uporządkowań danych wejściowych. Im ta złożoność jest bliższa złożoności przypadku optymistycznego, tym lepiej.

49 Szybkość wzrostu poszczególnych składników funkcji n - ilość wykonanych operacji Funkcja : f(n) = n 2 + 100*n + log 10 n + 1000 n f(n) n 2 100*n log 10 n 1000 1 1 101 0.1% 9% 0.0% 91% 10 2 101 4.8% 48% 0.05% 48% 100 21 002 48% 48% 0.001% 4.8% 10 3 1 101 003 91% 9% 0.0003% 0.09% 10 4 99% 1% 0.0% 0.001% 10 5 99.9% 0.1% 0.0% 0.0000% Dla dużych wartości n, funkcja rośnie jak n 2, pozostałe składniki mogą być zaniedbane.

50 Notacja wielkie O wprowadzona przez P. Bachmanna w 1894r O(g(n)) = {f (n) : istnieją dodatnie stałe c, n 0 takie, że 0 f (n) c g(n) dla wszystkich n n 0 }

Notacja wielkie O 51 O(g(n)) = {f (n) : istnieją dodatnie stałe c, n 0 takie, że 0 f (n) c g(n) dla wszystkich n n 0 } Przykład: f(n) = n 2 + 100*n + log 10 n + 1000 możemy przybliżyć jako f(n) ~ n 2 + 100*n + O(log 10 n) albo jako f(n) ~ O(n 2 )

Złożoność algorytmu 52 Złożoność czasowa algorytmu - zależność pomiędzy liczbą operacji elementarnych wykonywanych w trakcie przebiegu algorytmu, a rozmiarem danych wejściowych (podawana jako funkcja rozmiaru tych danych) sortowanie bąbelkowe: F( N) =?, gdzie N długość listy wieże Hanoi: F( N) =?, gdzie N liczba krążków wyznaczanie minimalnego drzewa rozpinającego: F( N, M)=? gdzie N liczba wierzchołków, a M - liczba krawędzi w grafie

53 Co to znaczy w praktyce? W praktyce złożoność czasowa decyduje o przydatności algorytmów jest mitem stwierdzenie, że komputery są tak szybkie, że czas nie stanowi problemu (rozkład na czynniki pierwsze dużych liczb - 300 cyfr - wymaga milionów lat) potrzebne jest rozwiązywanie coraz większych problemów: komputerowe systemy wspomagania decyzji komputerowe symulacje i prognozy muszą funkcjonować systemy komputerowe czasu rzeczywistego automatyczne sterowanie w złożonych układach

54 Szacowanie złożoności algorytmów Porównujemy dwa algorytmy wykonujące to samo zadanie za pomocą jednej iteracji ograniczonej (liczba iteracji N wynika jednoznacznie z rozmiaru danych wejściowych) Niech czasy wykonania algorytmów w funkcji rozmiaru danych wynoszą: F 1 ( N) = K 1 + L 1 N F 2 ( N) = K 2 + L 2 N Do ich porównania możemy wykorzystać iloraz: s(n) = F1( N) / F2( N)

55 Szacowanie złożoności algorytmów Jeśli s(n) = 1 to oba algorytmy mają jednakową prędkość działania; możliwe tylko wtedy, gdy K 1 = K 2 i L 1 = L 2. Jeśli s(n) < 1 to oznacza, że algorytm nr 1 jest szybszy. Ale dla pewnych wartości N może zachodzić s(n) > 1 (wtedy algorytm nr 2 jest szybszy).

56 Graniczne oszacowanie złożoności W przypadku granicznym, dla dowolnie dużych zestawów danych wejściowych (N ), o relacji pomiędzy algorytmami powinna decydować wartość: L1 lim s( N) N L 2 współczynnik porównania F 1 /F 2

57 Graniczne oszacowanie złożoności Dwa algorytmy o czasach wykonania F 1 (N) i F 2 (N) mają złożoność tego samego rzędu, jeśli: lim F1 ( N) F ( N N 2 ) C, gdzie 0 < C <. Jeżeli C = 0, to algorytm o czasie wykonania F 1 (N) ma niższy rząd złożoności (ma lepszą złożoność). Jeżeli C =, to algorytm o czasie wykonania F 1 (N) ma wyższy rząd złożoności (ma gorszą złożoność).

58 Notacja O Algorytm o czasie wykonania F(N) ma złożoność liniową Złożoność rzędu N lim N F( N ) N F(N) = O(N) Algorytm o czasie wykonania F(N) ma złożoność kwadratową F( N ) N Złożoność rzędu N 2 F(N) = O(N 2 ) C, lim 2 N 0 C, C 0 C Znalezienie algorytmu o niższym rzędzie złożoności jest ulepszeniem rozwiązania danego zadania algorytmicznego!

Szacowanie złożoności 59 Szacowania złożoności obliczeniowej algorytmu wyszukania elementu w liście posortowanej. przeszukiwanie liniowe przeszukiwanie binarne

60 Szacowanie złożoności Przeszukiwanie liniowe przeszukujemy kolejno elementy listy. Gdy znajdziemy szukany element, lub osiągniemy koniec listy algorytm kończy działanie. Algorytm 1 1. weź pierwszy element listy; 2. wykonuj: 2.1. sprawdź czy bieżący element jest tym szukanym; 2.2. sprawdź czy osiągnąłeś koniec listy ; 2.3. weź następny element z listy aż znajdziesz lub przejrzysz całą listę. czas wykonania Alg. 1 dla wyszukiwania liniowego F 1 (N) =2N

Szacowanie złożoności 61 Algorytm 2 1. dopisz szukany element na końcu listy; 2. weź pierwszy element listy; 3. wykonuj: 3.1. sprawdź czy bieżący element jest tym szukanym; 3.2. weź następny element z listy aż znajdziesz ; 4. sprawdź czy jesteś na końcu listy. czas wykonania Alg. 2 dla wyszukiwania liniowego F2(N) =N+1 N Oba mają pesymistyczny czas wykonania O(N).

62 Szacowanie złożoności Czy można stworzyć algorytm o mniejszej złożoności? Lista uporządkowana Y 1, Y 2,..., Y N (dla każdego i < j zachodzi Y i Y j ). Przeszukiwanie binarne

63 Szacowanie złożoności Przeszukiwanie binarne wielkość listy w kolejnych krokach wynosić będzie n, n/2, n/4, n/16, n/32, itd. ilość powtórzeń iteracji w najgorszym przypadku w algorytmie: 1 + log 2 n złożoność algorytmu wynosi O(log 2 n) Ponieważ: log ( N ) lim N N 2 0 algorytm wyszukiwania binarnego ma złożoność o rząd niższą od prostego wyszukiwania, ale ma zastosowanie tylko dla list uporządkowanych Nastąpiła bardzo istotna poprawa efektywności algorytmu

Porównanie złożoności 64 Skala ulepszeń N 1 + log 2 N 10 4 100 7 1 000 10 10 000 14 1 000 000 20 1 000 000 000 30 1 000 000 000 000 40 1 000 000 000 000 000 50 1 000 000 000 000 000 000 60

Przykłady złożoności 65 Wieże Hanoi :

66 Przykłady złożoności Wieże Hanoi algorytm rekurencyjny: procedura przenieś N ; 1. jeśli N = 1, to wypisz ruch i koniec; 2. w przeciwnym razie (tj. jeśli N > 1) wykonaj co następuje: 2.1. wywołaj przenieś N - 1 ; 2.2. wypisz ruch ; 2.3. wywołaj przenieś N -1 ; Oznaczmy nieznany koszt czasowy przez T( N) i dostajemy tzw. równania rekurencyjne: T(1) = 1 T( N) = 2 * T( N-1) +1 Spełnia je koszt T( N) = 2 N - 1, czyli złożoność jest O(2 N )

67 Układanka problem decyzyjny Problemem decyzyjnym nazywamy taki problem, którego rozwiązaniem są słowa "tak" lub "nie". Danych jest n kwadratowych kart, gdzie n jest kwadratem liczby naturalnej. W każdej z czterech części karty, wyznaczonej przez przekątne, wydrukowane są fragmenty kolorowych obrazków. Niektóre obrazki można złożyć razem, inne nie pasują do siebie. Problem polega na tym, by zbadać, czy z danych n kart można ułożyć kwadrat tak, by wszystkie obrazki pasowały kształtem i kolorem, (D. Harel, rzecz o istocie informatyki. Algorytmika, WNT, 1987.)

Układanka problem decyzyjny 68 Naiwny algorytm polega na przeglądaniu wszystkich możliwych ułożeń. Dla każdego konkretnego ułożenia kart, algorytm sprawdza, czy ułożenie jest poprawne. Sprawdzenie konkretnego ułożenia ma koszt liniowy, Liczba ułożeń powoduje, że koszt algorytmu naiwnego wynosi O(n!).

Zapotrzebowanie na czas 69 jedna instrukcja trwa mikrosekundę 1 milion instrukcji na sekundę

70 Tempo wzrostu funkcji złożoności Funkcje złożoności ogólnie dzielimy na: wielomianowe - ograniczone z góry przez N k (tzn. N k ); ponadwielomianowe - wykładnicze i inne szybciej rosnące (tzn. nie istnieje dla nich odpowiednie k) algorytm wielomianowy = algorytm o złożoności wielomianowej O( N k ) - szybki

71 Pytanie z milion dolarów

72 Pytanie z milion dolarów

Od razu widać czy dobrze 73 sprawdzenie poprawności rozwiązania jest łatwe, natychmiastowe znalezienie rozwiązania jest raczej trudne, kosztuje sporo wysiłku

Trzeba długo czekać.. 74 zakładamy 25 pustych pól wpisujemy liczby 4 bitowe (1..16) pojedyncza próba rozwiązania ciąg 100 liczb 0/1 czyli 2 100 możliwości 1 267 650 600 228 229 401 496 703 205 376 weryfikacja poprawności jedna operacja bitowa Dla maszyny o prędkości 10 15 /sek (petaflops) mamy 2 100 / 10 15 = 1267650600228229,401496703205376 sek 40 000 000 lat

75 Niedeterministyczna Maszyna Turinga Niedeterministyczna maszyna Turinga (NDTM) jest zdefiniowana dokładnie w ten sam sposób, co deterministyczna, jednak funkcja przejścia d(q,s) może mieć kilka różnych wartości (efektywnie powodując rozwidlenie działania programu na kilka możliwych ścieżek). Wynik obliczeń jest pozytywny, jeśli choć jedna z możliwych dróg działania maszyny doprowadzi do sukcesu.

Klasa P i NP 76 Problem należy do klasy złożoności czasowej P, gdy istnieje DTM rozwiązująca ten problem w czasie wielomianowym względem rozmiaru danych wejściowych. Problem należy do klasy złożoności czasowej NP, gdy istnieje NDTM weryfikująca rozwiązanie problemu w czasie wielomianowym względem rozmiaru danych wejściowych.

77 Problemy klasy NP Nondeterministic Polynomial-time wymagają sprawdzania rozwiązań częściowych i rozszerzania ich w celu znalezienia rozwiązania ostatecznego; jeśli rozwiązanie częściowe nie da się dalej rozszerzyć, to trzeba powrócić na wcześniejszy etap i po dokonaniu zmian rozpocząć od nowa, postępowanie polegające na systematycznym sprawdzeniu wszystkich możliwości wymaga czasu wykładniczego jeśli znamy rozwiązanie, to sprawdzenie jego poprawności może być przeprowadzone w czasie wielomianowym! dla każdego z problemów istnieje niedeterministyczny ( magiczny ) algorytm o złożoności wielomianowej NP NP są trudno rozwiązywalne, ale stają się łatwo rozwiązywalne, jeśli korzysta się z niedeterministycznej wyroczni

Klasa P i NP 78 Głupia układanka należy do klasy problemów NP-zupełne (NPC Nondeterministic Polynomial-time Complete), która obejmuje prawie 1000 problemów algorytmicznych o jednakowych cechach: dla wszystkich istnieją wątpliwe rozwiązania w postaci algorytmów wykładniczych dla żadnego nie znaleziono rozsądnego rozwiązania w postaci algorytmu wielomianowego dla żadnego nie udowodniono, że jego rozwiązania wymaga czasu wykładniczego najlepsze znane dolne ograniczenia są liniowe, tzn. O(N) Nie wiadomo czy są one trudno, czy łatwo rozwiązywalne!

Problem komiwojażera 79 Problem polega na znalezieniu w sieci połączeń pomiędzy miastami najkrótszej drogi, która pozwala odwiedzić każde z miast i powrócić do miasta wyjściowego (tzw. cykl). Problem formułowany jest jako poszukiwanie minimalnego pełnego cyklu w grafie z wagami krawędzi W wersji decyzyjnej problem polega na stwierdzeniu czy istnieje cykl o koszcie nie większym niż podana wartość K 6 3 3 7 9 8 5 10 3 7 4

Problem komiwojażera 80 Problem komiwojażera pojawia się przy: projektowaniu sieci telefonicznych projektowaniu układów scalonych planowaniu linii montażowych programowaniu robotów przemysłowych 6 Naiwne rozwiązanie N! 3 3 9 8 3 4 7 5 10 7 Przypadek nawet dla N = 25 jest beznadziejny

81 Czy każdy algorytm NP nie jest łatwy? Równość P = NP oznaczałaby, że właściwie nie ma naturalnych problemów obliczeniowych, które byłyby trudne, wszystko jest trudne nim stanie się łatwe Margaret Fuller Ale P NP tez nie zostało udowodnione

82 Problemy łatwe, trudne i Zadania łatwe : sortowanie mnożenie macierzy sprawdzenie, czy w grafie istnieje cykl Eulera Zadania trudne : szukanie najkrótszej ścieżki komiwojażera szukanie najkrótszej postaci danej formuły logicznej sprawdzenie, czy w grafie istnieje cykl Hamiltona

Problemy SAT 83 Czy dana formuła logiczna jest spełnialna F ( p q r) ( p q s) ( q r s) dla p = q = 1 i dowolnych s oraz r Pierwszym problemem, którego NP-zupełność wykazano, 1971 Stephen Cook.

Problemy SAT 84 Czy dana formuła logiczna jest spełnialna F ( p q r) ( p q s) ( q r s) dla p = q = 1 i dowolnych s oraz r Pierwszym problemem, którego NP-zupełność wykazano, 1971 Stephen Cook.

Klasa P i NP 85 Głupia układanka należy do klasy problemów NP-zupełne (NPC Nondeterministic Polynomial-time Complete), która obejmuje prawie 1000 problemów algorytmicznych o jednakowych cechach: dla wszystkich istnieją wątpliwe rozwiązania w postaci algorytmów wykładniczych dla żadnego nie znaleziono rozsądnego rozwiązania w postaci algorytmu wielomianowego dla żadnego nie udowodniono, że jego rozwiązania wymaga czasu wykładniczego najlepsze znane dolne ograniczenia są liniowe, tzn. O(N) Nie wiadomo czy są one trudno, czy łatwo rozwiązywalne!

86 Problemy klasy NP Nondeterministic Polynomial-time wymagają sprawdzania rozwiązań częściowych i rozszerzania ich w celu znalezienia rozwiązania ostatecznego; jeśli rozwiązanie częściowe nie da się dalej rozszerzyć, to trzeba powrócić na wcześniejszy etap i po dokonaniu zmian rozpocząć od nowa, postępowanie polegające na systematycznym sprawdzeniu wszystkich możliwości wymaga czasu wykładniczego jeśli znamy rozwiązanie, to sprawdzenie jego poprawności może być przeprowadzone w czasie wielomianowym! dla każdego z problemów istnieje niedeterministyczny ( magiczny ) algorytm o złożoności wielomianowej NP NP są trudno rozwiązywalne, ale stają się łatwo rozwiązywalne, jeśli korzysta się z niedeterministycznej wyroczni

albo wszystkie te problemy są łatwo rozwiązywalne, albo wszystkie trudno Problemy NP-zupełne 87 każdy problem klasy NP można przekształcić do jednego z nich w czasie wielomianowym - NPC (ang. Nondeterministic Polynomial-time Complete) każdy problem z tej klasy można przekształcić w czasie wielomianowym do każdego innego! znalezienie algorytmu wielomianowego dla jednego z problemów oznacza możliwość rozwiązania w czasie wielomianowym wszystkich innych udowodnienie wykładniczego dolnego oszacowania dla jednego z problemów oznacza wykazanie, że żaden z nich nie może być rozwiązany w czasie wielomianowym!

Problemy NP-zupełne 88 wykazanie, że nowy problem jest NP-zupełny przebiega w dwóch krokach: trzeba udowodnić, że nowy problem jest klasy NP. trzeba skonstruować przekształcenie, które w czasie wielomianowym transformuje do niego dowolny znany problem NP-zupełny Twierdzenie Cooka : problem spełnialności formuł logicznych jest problemem NP-zupełnym pierwszy znany problem NP-zupełny. Od momentu jego udowodnienia można stosować transformacje wielomianowe do dowodzenia NP-zupełności innych problemów decyzyjnych.

Klasy problemów 89 Klasa NP - problemy posiadające niedeterministyczne algorytmy o czasie wielomianowym Klasa P - problemy posiadające zwykłe algorytmy o czasie wielomianowym (łatwo rozwiązywalne) Klasa NP-zupełne - wzorcowe problemy z klasy NP sprowadzalne jeden do drugiego

90 Klasy problemów

91 Problem decyzyjny algorytmicznie nierozstrzygalny Problem decyzyjny nazywamy rozstrzygalnym algorytmicznie, jeżeli istnieje algorytm (w sensie Turinga), który dla zadanego n znajduje prawidłową odpowiedź TAK lub NIE.

STOP? 92 Nie jest możliwe napisanie programu, który może zbadać każdy inny program i stwierdzić w każdym przypadku, czy po uruchomieniu zatrzyma się on, czy też wejdzie w nieskończoną pętlę. Zakładamy, że istnieje funkcja logiczna T(R), której argumentem R jest jakikolwiek program i T(R) = True, jeśli program R kończy swoje działania, T(R) = False, jeśli program R nie kończy działania. Mamy podprogram P proc P; while T(P) do ; return

STOP? 93 proc P; while T(P) do ; return Jeżeli T(P) = True to P zapętla się Tylko jeśli T(P) = False program P zakończy się SPRZECZNOŚĆ