ZLOŻONOŚĆ OBLICZENIOWA - WYK. 2

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

Maszyna Turinga języki

Języki, automaty i obliczenia

Imię, nazwisko, nr indeksu

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

ZŁOŻONOŚĆ OBLICZENIOWA ALGORYTMÓW

Hierarchia Chomsky ego Maszyna Turinga

Problemy Decyzyjne dla Systemów Nieskończonych

Podstawy Informatyki. Sprawność algorytmów

TEORETYCZNE PODSTAWY INFORMATYKI

Dopełnienie to można wyrazić w następujący sposób:

Obliczenia inspirowane Naturą

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

Zadanie 1. (6 punktów) Słowo w nazwiemy anagramem słowa v jeśli w można otrzymać z v poprzez zamianę kolejności liter. Niech

1 Maszyny Turinga. stan 1 litera 1 litera 2 ruch stan 2. Matematycznie P S (Q {B}) (Q {B}) {L, R, } S

Zakładamy, że maszyna ma jeden stan akceptujacy.

Złożoność informacyjna Kołmogorowa. Paweł Parys

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

PROBLEMY NIEROZSTRZYGALNE

złożony ze słów zerojedynkowych o długości co najmniej 3, w których druga i trzecia litera od końca sa

Rozwiązania około dwustu łatwych zadań z języków formalnych i złożoności obliczeniowej i być może jednego chyba trudnego (w trakcie tworzenia)

Języki, automaty i obliczenia

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

Zasady analizy algorytmów

Matematyczne Podstawy Informatyki

Lista 0. Kamil Matuszewski 1 marca 2016

10110 =

Luty 2001 Algorytmy (4) 2000/2001

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

ZŁOŻONOŚĆ OBLICZENIOWA ALGORYTMÓW

Języki, automaty i obliczenia

Języki formalne i automaty Ćwiczenia 9

TEORETYCZNE PODSTAWY INFORMATYKI

Wprowadzenie do złożoności obliczeniowej

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

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

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}

Teoria obliczeń czyli czego komputery zrobić nie mogą

Efektywność algorytmów

1 Automaty niedeterministyczne

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

Krzysztof Gniłka. Twierdzenie o rekurencji uniwersalnej

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

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

Algorytmy Równoległe i Rozproszone Część III - Układy kombinacyjne i P-zupełność

Programowanie dynamiczne

Logika stosowana. Ćwiczenia Złożoność obliczeniowa problemu spełnialności. Marcin Szczuka. Instytut Informatyki, Uniwersytet Warszawski

Wstęp do programowania

Reprezentacje grafów nieskierowanych Reprezentacje grafów skierowanych. Wykład 2. Reprezentacja komputerowa grafów

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

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.

Minimalizacja automatów niedeterministycznych na słowach skończonych i nieskończonych

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

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

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

Algorytmy Równoległe i Rozproszone Część V - Model PRAM II

Wykład z Technologii Informacyjnych. Piotr Mika

Wyszukiwanie. Wyszukiwanie binarne

Efektywność Procedur Obliczeniowych. wykład 5

Indukcja matematyczna

Przykładowe zadania z teorii liczb

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Wokół Problemu Steinhausa z teorii liczb

Szeregi o wyrazach dodatnich. Kryteria zbieżności d'alemberta i Cauchy'ego

Liczby pierwsze. Kacper Żurek, uczeń w Gimnazjum nr 1 im. Jana Pawła II w Giżycku.

1. Analiza algorytmów przypomnienie

Algorytmiczna teoria grafów

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

Heurystyki. Strategie poszukiwań

Modele Obliczeń. Wykład 1 - Wprowadzenie. Marcin Szczuka. Instytut Matematyki, Uniwersytet Warszawski

Wyszukiwanie binarne

Wprowadzenie do maszyny Turinga

Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Algorytmy w teorii liczb

Materiały dla finalistów

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

Algebrą nazywamy strukturę A = (A, {F i : i I }), gdzie A jest zbiorem zwanym uniwersum algebry, zaś F i : A F i

Lista 4. Kamil Matuszewski 22 marca 2016

Instrukcje dla zawodników

Schemat rekursji. 1 Schemat rekursji dla funkcji jednej zmiennej

Matematyczna wieża Babel. 4. Ograniczone maszyny Turinga o językach kontekstowych materiały do ćwiczeń

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

Teoretyczne podstawy informatyki

Typy algorytmów losowych. ALP520 - Wykład z Algorytmów Probabilistycznych p.2

Kolejny krok iteracji polega na tym, że przechodzimy do następnego wierzchołka, znajdującego się na jednej krawędzi z odnalezionym już punktem, w

Zadanie: Wymyślić efektywną reprezentację par ciągów binarnych jako ciągów binarnych. Rozwiązanie: Propozycja wypracowana na ćwiczeniach

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

Wykład 2. Drzewa zbalansowane AVL i 2-3-4

Drzewa rozpinajace, zbiory rozłaczne, czas zamortyzowany

Informacja w perspektywie obliczeniowej. Informacje, liczby i obliczenia

Turing i jego maszyny

SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE

Zadanie 1. Czy prawdziwa jest następująca implikacja? Jeśli L A jest językiem regularnym, to regularnym językiem jest też. A = (A, Q, q I, F, δ)

Zapisujemy to symbolicznie jako równość:. Mówimy też, że ciąg posiada granicę niewłaściwą (równą nieskończoności).

Poprawność semantyczna

Technologie Informacyjne

i = n = n 1 + n 2 1 i 2 n 1. n(n + 1)(2n + 1) n (n + 1) =

Dwa równania kwadratowe z częścią całkowitą

Maszyna Turinga, ang. Turing Machine (TM)

Transkrypt:

ZLOŻONOŚĆ OBLICZENIOWA - WYK. 2 1. Twierdzenie Sipsera: Dla dowolnej maszyny M działającej w pamięci S(n) istnieje maszyna M taka, że: L(M) = L(M ), M działa w pamięci S(n), M ma własność stopu. Dowód: ze skryptu Damiana Niwińskiego. jak wygląda graf konfiguracji maszyny M na konkretnym słowie wejściowym w (pojedyncze cykle i drzewa; fragmenty z konfiguracjami akceptującymi to drzewa). jak sprawdzić czy M akceptuje słowo w? Można po prostu wykonać maszynę M, czyli przeglądać graf wzdłuż krawędzi poczynając od konfiguracji początkowej. Problem: Jak wykryć pętlenie? Pomysł I: wypisywać wszystkie konfiguracje po kolei i porównywać aktualną z poprzednimi. Problem: to zużywa o wiele więcej pamięci niż M. Pomysł II: liczyć kroki. Skoro maszyna M używa f(n) pamięci, to jej konfiguracje można zapamiętać w pamięci rozmiaru f(n). Można więc zrobić licznik o tym rozmiarze. Problemy: (i) Widząc maszynę M być może nie umiemy stwierdzić jaka jest funkcja f(n) (NB. z pomysłu Sipsera okaże się że umiemy). To jest problem pozorny: wiemy że taka funkcja istnieje, więc istnieje maszyna, która na początku rezerwuje licznik o tym rozmiarze. Być może nie umiemy jej obliczyć z M, ale to nie szkodzi. (ii) Ale czy na pewno taka maszyna istnieje? Funkcja f(n) musi być pamięciowo konstruowalna (powiemy o tym później). (iii) Wymogu pamięciowej konstruowalności można uniknąć: maszyna symulująca może nie rezerwować całego licznika od razu, tylko zwiększać go w miarę potrzeby, tak by zawsze był taki duży jak pamięć użyta do tej pory przez maszynę symulowaną. Jeżeli taki licznik się w pewnej chwili przepełni, to maszyna symulowana się pętli. Ale jest jeszcze jeden problem: (iv) Jeżeli f(n) jest mniejsza od log n, to konfiguracji maszyny M nie zmieścimy w pamięci f(n), bo do konfiguracji należy położenie głowicy na taśmie wejściowej. Języki rozpoznawalne w pamięci mniejszej niż log n nie są zbyt interesujące, ale istnieją. Pomysł III (Sipser): przeglądać graf od tyłu, zaczynając od konfiguracji akceptujących. 1

zaleta: problem cykli w ogóle znika, bo nie ma ich w tych fragmentach grafu. wada: konfiguracji akceptujących jest nieskończenie wiele, a w ich drzewach są nieskończone ścieżki. Procedura Search(C, k, w): działa na taśmie wejściowej z zapisanym słowem w, i z taśmą roboczą, na której zaznaczono k pozycji. Zaczynając od konfiguracji C, przechodzi graf DFS-em szukając konfiguracji początkowej, przy czym ogranicza się tylko do konfiguracji z pamięcią roboczą co najwyżej k. Jeżeli z C nie ma kroku do innej k-konfiguracji, to ta procedura ma własność stopu i działa w pamięci k. (Wyjaśnić jak zrobić DFS w pamięci k: trzeba pamiętać czy przyszliśmy z dołu czy z góry drzewa, a jeśli z dołu to z którego syna.) oto algorytm symulujący maszynę M od tyłu: dla kolejno rosnących k wykonaj następujące kroki: przejrzyj wszystkie k-konfiguracje i wybierz te, z których jest przejście do k + 1-konfiguracji. dla każdej takiej C poszukaj Search(C, k, w). Jeśli się udało, to zwiększ k i od początku. Po tej pętli wiemy, że M na słowie w używa dokładnie k pamięci. Teraz trzeba tylko sprawdzić czy akceptuje. w tym celu robimy Search(C, k, w) z wszystkich k-konfiguracji akceptujących. 2. Wniosek z tw. Sipsera: jeśli język L jest częściowo obliczalny, ale nie rozstrzygalny, to każda maszyna M, która go rozpoznaje, na pewnym słowie w zużywa nieskończenie wiele pamięci. Dowód: Gdyby na każdym słowie M zużywała tylko skończoną pamięć, to istniałaby funkcja S(n) taka, że M działa w pamięci S(n). Z tw. Sipsera, język L byłby rozstrzygalny. 3. Funkcja f(n) jest czasowo konstruowalna jeśli istnieje maszyna M, która na słowie wejściowym 1 n : produkuje słowo o długości dokładnie f(n), działa w czasie O(f(n)). Ćwiczenia: jeśli f i g są konstruowalne to f + g, f g, f g też. Funkcje n, n log n, n k, k n są konstruowalne. Uwaga: log n, ani żadna funkcja asymptotycznie mniejsza od n, nie jest czasowo konstruowalna. 4. Funkcja f(n) jest pamięciowo konstruowalna jeśli istnieje maszyna M, która na słowie wejściowym 1 n : produkuje słowo o długości dokładnie f(n), 2

działa w pamięci O(f(n)). Ćwiczenia: Każda funkcja czasowo konstruowalna jest pamięciowo konstruowalna. Jeśli f i g są konstruowalne to f + g, f g, f g też. Funkcje n, log n, n k, k n są konstruowalne. Funkcja log log n nie jest pamięciowo konstruowalna; kolosalnie szybko rosnące funkcje też nie. 5. Mogłoby się wydawać, że jeśli jakaś maszyna działa w pamięci S(n), to funkcja S(n) jest pamięciowo konstruowalna. Tymczasem to jest nieprawda. Jeśli maszyna M działa w pamięci dokładnie S(n), to dla każdego n istnieje słowo w długości n takie, że M zużywa S(n) pamięci. Ale próbując skonstruować funkcję S(n), dostajemy słowo z 0 n. I nie wiadomo jak skonstruować to najgorsze słowo w. Jeśli S(n) > n to spoko, możemy przejrzeć wszystkie słowa długości n i na każdym uruchomić M, ale jeśli S(n) jest małe, to nie możemy tego zrobić. W istocie: Ćwiczenie: Istnieje język, który nie jest regularny, ale rozpoznawalny w pamięci log log n + 1. Twierdzenie: Funkcja log log n nie jest pamięciowo konstruowalna. Dowód: Załóżmy że maszyna M działa w pamięci O(log log n); niech dla dużych długości n używa co najwyżej c log log n komórek. Wtedy różnych konfiguracji wewnętrznych, tj. z pominięciem pozycji głowicy na taśmie wejściowej, ma log d n, dla pewnej stałej d. Weźmy takie m, że log d m < m. Rozważmy bieg maszyny M na słowie 0 m. Weźmy jakiś jego kawałek, który zaczyna się na początku słowa, kończy na końcu słowa, a po drodze nie odwiedza ani początku ani końca. Gdzieś na tym kawałku powtarzają się konfiguracje wewnętrzne. Jeśli odległość między wystąpieniami jest k > 0, to ten kawałek biegu na słowie 0 m+nk (dla dowolnego n) wygląda tak samo jak na słowie 0 m. Na różnych takich kawałkach mogą być różne k, ale na słowie 0 m+m! wszystkie te kawałki wyglądają tak samo; w szczególności używają takiej samej pamięci roboczej. To samo na słowach 0 m, 0 m+m!, 0 m+2m!,... Wobec tego M nie używa zawsze log log n pamięci, nawet asymptotycznie. Uwaga: To pokazuje, że żadna funkcja rosnąca w o(log n) nie jest pamięciowo konstruowalna. ALE: istnieje nieograniczona funkcja w O(log log n) pamięciowo konstruowalna. (Hint: nie jest rosnąca). Rozwiązanie:. S(n) = log(min{i i nie jest dzielnikiem n}) 3

6. Twierdzenie o hierarchii pamięciowej: jeśli funkcja g(n) jest pamięciowo konstruowalna, g(n) log n i f(n) = o(g(n)), to DSPACE(f(n)) DSPACE(g(n)). Dowód: Jest to wariant dowodu Turinga o nierozstrzygalności problemu stopu. Rozważmy język: L = {([M], w) M odrzuca słowo ([M], w) w pamięci g( [M], w )} Po pierwsze, L DSPACE(f(n)). Jeśli bowiem maszyna M działa w pamięci f(n), to dla pewnego odpowiednio długiego słowa w na słowie [M ], w używa mniej niż g( [M ], w ) pamięci i dostajemy sprzeczność: M akceptuje słowo [M ], w wtw. to słowo nie jest w L, więc M nie rozpoznaje języka L. Po drugie, L można rozpoznać w pamięci O(g(n)). Robimy to tak: na słowie o długości n, korzystając z pamięciowej konstruowalności, rezerwujemy g(n) pamięci roboczej. sprawdzamy czy słowo jest postaci [M], w; w przeciwnym razie odrzucamy. Do tego potrzeba log n pamięci. nie mamy gwarancji czy M ma własność stopu, więc musimy wykrywać pętlenie. W tym celu rezerwujemy licznik rozmiaru O(g(n)). symulujemy maszynę M na słowie w w zarezerwowanej pamięci, za każdym krokiem inkrementując licznik. Jeśli M spróbuje wyjść poza pamięć lub czas, to odrzucamy. Jeśli M zaakceptuje, odrzucamy. Jeśli odrzuci, akceptujemy. 7. Twierdzenie o hierarchii czasowej: jeśli funkcja g(n) jest czasowo konstruowalna i f(n) = o(g(n)), to DTIME(f(n)) DTIME(g(n) 2 ). Dowód: Podobnie jak poprzednio, rozważmy język: L = {([M], w) M odrzuca słowo ([M], w) w czasie g( [M], w )} Jak poprzednio, L DTIME(f(n)). Argument jest taki sam. Po drugie, L można rozpoznać w czasie O(g(n) 2 ). Robimy to tak: sprawdzamy czy słowo jest postaci [M], w; w przeciwnym razie odrzucamy. Do tego potrzeba czasu O(n). korzystając z czasowej konstruowalności, na jednej z taśm roboczych rezerwujemy licznik rozmiaru c g(n), dla odpowiedniej stałej c. 4

symulujemy maszynę M na słowie w na taśmie wejściowej, za każdym krokiem inkrementując licznik (zapisany unarnie). Jeśli M spróbuje wyjść poza czas, to odrzucamy. Jeśli M zaakceptuje, odrzucamy. Jeśli odrzuci, akceptujemy. Symulacja każdego kroku zajmuje czas g(n): na słowie wejściowym trzeba odszukać w kodzie maszyny M następny krok do wykonania, a potem wrócić głowicą we właściwe miejsce. 8. Tak naprawdę twierdzenie o hierarchii czasowej jest mocniejsze: DTIME(f(n)) DTIME(g(n) log(g(n))). To samo działa nawet wtedy, gdy do definiowana DTIME użyje się maszyn jednotaśmowych, chociaż dowód jest trudniejszy. Jedyny problem polega na sprytnym ograniczaniu narzutu na symulacje maszyn maszyną uniwersalną. 9. Wnioski z twierdzeń o hierarchii: DTIME(n k ) DTIME(n k+1 ), DSPACE(n k ) DSPACE(n k+1 ), L PSPACE, P EXPTIME. Tę ostatnią nierówność pokazuje się tak: P DTIME(2 n ) DTIME(2 2n ) EXPTIME 10. Twierdzenie o luce czasowej: istnieje taka obliczalna funkcja f(n), że DTIME(f(n)) = DTIME(2 f(n) ). Dowód: Wymyślamy funkcję f(n) taką, że żadna maszyna nie zatrzymuje się między f(n) a 2 f(n) kroków. Ponumerujmy wszystkie maszyny Turinga w sposób obliczalny. niech P (i, k) będzie spełnione wtw. gdy każda z pierwszych i maszyn, na każdym wejściu o długości co najwyżej i, zatrzymuje się po mniej niż k krokach lub po więcej niż 2 k krokach (albo się pętli). Relacja P jest oczywiście obliczalna. dla liczby i, zdefiniuj k 1 = i, a potem k j+1 = 2 kj. każde wejście długości co najwyżej i może sfalsyfikować tylko jedno P (i, k j ), więc istnieje takie j < Γ i że P (i, k j ) jest prawdziwe. definiujemy f(i) = k j. Ta funkcja jest obliczalna. Weźmy teraz dowolną maszynę (o numerze M k ) działającą w czasie DTIME(2 f(n) ). Dla każdego wejścia x dłuższego niż k maszyna nie może się zatrzymać między f( x ) a 2 f( x ) krokami, więc musi się zatrzymać co najwyżej po f( x ) krokach. Wejść krótszych niż k jest stała liczba. W sumie język tej maszyny można rozpoznać w DTIME(f(n)). Oczywiście funkcja f(n) nie jest czasowo konstruowalna. Można ją obliczyć, ale w o wiele dłuższym czasie. Takie samo twierdzenie o luce zachodzi dla złożoności pamięciowej. 5