Złożoność obliczeniowa wykład 1
Dwa wykłady: wtorek / środa różnice niewielkie Sprawy organizacyjne wtorek: trochę szybciej, parę dodatkowych rzeczy dedykowana grupa ćw. M. Pilipczuka - ale śmiało mogą przychodzić we wtorek osoby z innych grup zadania domowe, kolokwium, egzamin wspólne Slajdy (i inne materiały) będą dostępne na stronie www.
Zasady zaliczania: Sprawy organizacyjne zadania domowe (3 serie) 1.5 pkt kolokwium 1.5 pkt każdy może podejść do egzaminu w pierwszym terminie (nie ma progu zaliczenia ćwiczeń) egzamin 1. termin 3 pkt do oceny liczy się: zad_dom + kolokwium + egzamin egzamin poprawkowy 4.5 pkt do oceny liczy się: zad_dom + egzamin egzamin = zadania + teoria
O czym jest ten przedmiot? przedmiot badań: problemy obliczeniowe podstawowe pytanie: jak szybko można rozwiązać dany problem? co to znaczy, że problem jest trudny? (może tylko nie jesteśmy wystarczająco inteligentni, aby go rozwiązać?) JAiO: są problemy rozstrzygalne i nierozstrzygalne tutaj: są (rozstrzygalne) problemy łatwe i trudne (w różnym sensie) algorytmika: mamy szybki algorytm tutaj: szybki algorytm nie istnieje
Maszyna Turinga formalna definicja obliczenia David Hilbert: Czy istnieje algorytm rozstrzygający dowolną hipotezę matematyczną? ( Entscheidungsproblem - 1928) Alonzo Church (1936), Alan Turing (1937) NIE Odpowiedź wymagała formalnej definicji co to jest algorytm maszyna Turinga (rachunek lambda - Church)
Maszyna Turinga formalna definicja obliczenia Składniki maszyny Turinga: skończony alfabet roboczy, gdzie, alfabet wejściowy \{, } skończony zbiór stanów Q stany: początkowy, akceptujący, odrzucający q I,q A,q R Q funkcja przejścia :(Q\{qA,q R }) Q {L,R,Z} taka, że
Maszyna Turinga formalna definicja obliczenia Składniki maszyny Turinga: skończony alfabet roboczy, gdzie, alfabet wejściowy \{, } skończony zbiór stanów Q stany: początkowy, akceptujący, odrzucający q I,q A,q R Q funkcja przejścia :(Q\{qA,q R }) Q {L,R,Z} taka, że Konfiguracja maszyny Turinga: zawartość taśmy, nieskończonej w prawo położenie głowicy stan a b a a a a b c d... q 5 formalnie np: a b a a q 5 a a b c d...
Maszyna Turinga formalna definicja obliczenia Obliczenie: funkcja M między konfiguracjami Przykład: (q 5,a)=(q 8,x,L) zwyczajowa notacja: q 5,a q 8,x,L jeśli stan to q 5, litera pod głowicą to a to przejdź do stanu q 8 zapisz x na taśmie przesuń głowicę w lewo q 5 a b a a a a b c d... q 8 a b a a x a b c d...
Maszyna Turinga formalna definicja obliczenia Dodatkowe założenia o konfiguracji: taśma od pewnego miejsca zawiera tylko pierwszy symbol taśmy to później nie występuje Dodatkowe założenia o funkcji przejścia: maszyna nie chce nadpisać ani postawić go gdzieś dalej nie chce też pójść w lewo gdy widzi
Maszyna Turinga formalna definicja obliczenia Obliczenie na słowie wejściowym w *: konfiguracja początkowa: q I w maszyna akceptuje w, jeśli wpada w stan q A a b a a a b c a b c d... maszyna odrzuca w, jeśli wpada w stan q R wpp. obliczenie jest nieskończone (maszyna się zapętla)
Maszyna Turinga formalna definicja obliczenia Obliczenie na słowie wejściowym w *: konfiguracja początkowa: q I w maszyna akceptuje w, jeśli wpada w stan q A a b a a a b c a b c d... maszyna odrzuca w, jeśli wpada w stan q R wpp. obliczenie jest nieskończone (maszyna się zapętla) oznaczmy: L(M)={w : M akceptuje w} M ma własność stopu, jeśli zatrzymuje się na każdym słowie język L * jest częściowo obliczalny (lub rekurencyjnie przeliczalny) jeśli istnieje maszyna, która akceptuje dokładnie słowa z L (czyli L(M)=L) jeśli ta maszyna ma własność stopu, to L jest obliczalny (rozstrzygalny)
Maszyna Turinga formalna definicja obliczenia M ma własność stopu, jeśli zatrzymuje się na każdym słowie język L * jest częściowo obliczalny (lub rekurencyjnie przeliczalny) jeśli istnieje maszyna, która akceptuje dokładnie słowa z L jeśli ta maszyna ma własność stopu, to L jest obliczalny (rozstrzygalny) Ćwiczenia: jeśli L i dopełnienie L są częściowo obliczalne, to są obliczalne
Maszyna Turinga formalna definicja obliczenia M ma własność stopu, jeśli zatrzymuje się na każdym słowie język L * jest częściowo obliczalny (lub rekurencyjnie przeliczalny) jeśli istnieje maszyna, która akceptuje dokładnie słowa z L jeśli ta maszyna ma własność stopu, to L jest obliczalny (rozstrzygalny) Ćwiczenia: jeśli L i dopełnienie L są częściowo obliczalne, to są obliczalne Obliczanie funkcji: funkcja częściowa f: * * jest obliczalna, jeśli istnieje M, która akceptuje każde w dom(f) w konfiguracji z taśmą f(w) oraz odrzuca każde w dom(f)
Warianty maszyn Turinga taśma nieskończona w obie strony wiele stanów akceptujących / odrzucających maszyny k-taśmowe :(Q\{q A,q R }) k Q k {L,R,Z} k maszyny niedeterministyczne, alternujące (te były deterministyczne)...
Warianty maszyn Turinga taśma nieskończona w obie strony wiele stanów akceptujących / odrzucających maszyny k-taśmowe :(Q\{q A,q R }) k Q k {L,R,Z} k maszyny niedeterministyczne, alternujące (te były deterministyczne)... Fakt: Wszystkie rozpoznają tę samą klasę języków. Uwaga: wystarczy pokazać, że dla każdej maszyny typu X istnieje równoważna maszyna typu Y. W praktyce te konstrukcje są obliczalne, ale nie musimy tego wiedzieć. To będzie częsty motyw na tym przedmiocie: kiedy wystarczy, że coś istnieje, a kiedy musimy umieć to (szybko) policzyć?
Przykład: osiągalność w grafie Problemy decyzyjne vs. języki Wejście: zbiór wierzchołków, zbiór krawędzi, dwa wyróżnione wierzch. Wejście jest skomplikowanym obiektem, a nie słowem. Maszyna Turinga wczytuje słowa. Ale - graf możemy zapisać jako słowo: liczba_wierzchołków, liczba_krawędzi, lista par wierzchołków połączonych krawędziami (zakładając, że wierzchołki są numerowane kolejnymi liczbami naturalnymi); poszczególne liczby pooddzielane jakimś znakiem $. Wiele możliwych reprezentacji grafów Można łatwo przekształcić jedną reprezentację w drugą.
Problemy decyzyjne vs. języki Rozważając konkretny problem myślimy o algorytmie rozumianym abstrakcyjnie, zwykle nie odwołując się do konkretnej reprezentacji lecz mamy świadomość tego, że można zaimplementować standardowe konstrukcje programistyczne (zmienne, pętle, itp.) na maszynie Turinga. Dowodząc ogólnych twierdzeń rozważamy maszyny Turinga (model prosty, ale mocny).
Problemy decyzyjne vs. języki Rozważając konkretny problem myślimy o algorytmie rozumianym abstrakcyjnie, zwykle nie odwołując się do konkretnej reprezentacji lecz mamy świadomość tego, że można zaimplementować standardowe konstrukcje programistyczne (zmienne, pętle, itp.) na maszynie Turinga. Dowodząc ogólnych twierdzeń rozważamy maszyny Turinga (model prosty, ale mocny). Teza Turinga-Churcha: wszystko, co można obliczyć w intuicyjnym sensie, można obliczyć na maszynie Turinga. (to nie jest twierdzenie matematyczne co to znaczy obliczyć w intuicyjnym sensie?) Teza mocniejsza: problemy łatwe maszyny Turinga rozwiązują szybko.
Złożoność czasowa Maszyna M działa w czasie T(n) (dla funkcji T:N N) jeśli dla każdego słowa w * zatrzymuje się po co najwyżej T( w ) krokach. (w szczególności ma własność stopu) Język L * jest rozpoznawalny w czasie T(n) jeśli istnieje maszyna wielotaśmowa, która go akceptuje w czasie T(n). Aby szczegóły definicji maszyny nie grały roli, mówimy zwykle o czasie O(T(n)).
Złożoność czasowa Maszyna M działa w czasie T(n) (dla funkcji T:N N) jeśli dla każdego słowa w * zatrzymuje się po co najwyżej T( w ) krokach. (w szczególności ma własność stopu) Język L * jest rozpoznawalny w czasie T(n) jeśli istnieje maszyna wielotaśmowa, która go akceptuje w czasie T(n). Aby szczegóły definicji maszyny nie grały roli, mówimy zwykle o czasie O(T(n)). Ćwiczenia: Język palindromów jest rozpoznawalny w czasie liniowym, lecz maszyna jednotaśmowa potrzebuje czasu kwadratowego.
Złożoność czasowa Maszyna M działa w czasie T(n) (dla funkcji T:N N) jeśli dla każdego słowa w * zatrzymuje się po co najwyżej T( w ) krokach. (w szczególności ma własność stopu) Język L * jest rozpoznawalny w czasie T(n) jeśli istnieje maszyna wielotaśmowa, która go akceptuje w czasie T(n). Aby szczegóły definicji maszyny nie grały roli, mówimy zwykle o czasie O(T(n)). Ćwiczenia: Język palindromów jest rozpoznawalny w czasie liniowym, lecz maszyna jednotaśmowa potrzebuje czasu kwadratowego. Twierdzenie (o liniowym przyspieszeniu): Jeśli język L jest rozpoznawalny w czasie T(n), to dla każdej stałej c>0 jest on rozpoznawalny w czasie c. T(n)+O(n). Dowód: na ćwiczeniach (pomysł: liczymy liczbę kroków, więc wystarczy wykonywać klika kroków na raz).
Złożoność czasowa podstawowe klasy DTIME(T(n)) języki rozpoznawalne w czasie O(T(n)) P= k N DTIME(n k ) czyli języki rozpoznawalne w czasie p(n) dla pewnego wielomianu p EXPTIME= k N DTIME(2 nk )
Złożoność pamięciowa Mierząc pamięć, nie chcemy uwzględniać rozmiaru wejścia (istotne w przypadku zużycia pamięci mniejszego niż liniowe) Dlatego definiując złożoność pamięciową rozważamy maszyny off-line: taśma wejściowa, tylko do odczytu (gdy widzę, to nie mogę iść dalej w prawo) taśmy robocze przy obliczaniu funkcji: taśma wyjściowa, gdzie głowica idzie tylko w prawo (czyli: tylko do zapisu)
Złożoność pamięciowa Mierząc pamięć, nie chcemy uwzględniać rozmiaru wejścia (istotne w przypadku zużycia pamięci mniejszego niż liniowe) Dlatego definiując złożoność pamięciową rozważamy maszyny off-line: taśma wejściowa, tylko do odczytu (gdy widzę, to nie mogę iść dalej w prawo) taśmy robocze przy obliczaniu funkcji: taśma wyjściowa, gdzie głowica idzie tylko w prawo (czyli: tylko do zapisu) Maszyna M działa w pamięci S(n) (dla funkcji S:N N) jeśli dla każdego słowa w * odwiedza co najwyżej S( w ) komórek na taśmach roboczych. Język L * jest rozpoznawalny w pamięci S(n) jeśli istnieje maszyna wielotaśmowa mająca własność stopu, akceptująca L w pamięci S(n). Mówimy zwykle o pamięci O(S(n)). Łatwo zmniejszyć zużycie pamięci razy stała - pamiętamy kilka komórek w jednej. Możemy też zamienić maszynę wielotaśmową na maszynę z jedną taśmą roboczą, zużywającą tyle samo pamięci.
Złożoność pamięciowa podstawowe klasy DSPACE(S(n)) języki rozpoznawalne w pamięci O(S(n)) L=DSPACE(log n) PSPACE= k N DSPACE(n k ) czyli języki rozpoznawalne w pamięci p(n) dla pewnego wielomianu p EXPSPACE= k N DSPACE(2 nk )
DTIME(f(n)) DSPACE(f(n)) Czas a pamięć Dowód: W czasie f(n) maszyna może odwiedzić co najwyżej k. f(n) komórek (k = liczba taśm)
Czas a pamięć Odwrotnie: DSPACE(f(n)) c>0 DTIME(n. c f(n) ) jeśli f(n) log(n), to po prostu: DSPACE(f(n)) c>0 DTIME(c f(n) ) Dowód: Weźmy L DSPACE(f(n)), rozpoznawany przez M. M się nie zapętla, więc (liczba odwiedzonych konfiguracji) = (liczba kroków) (liczba wszystkich konfiguracji) (liczba kroków) konfiguracji jest: Q. (n+2). (4 ) df(n) stan zawartość taśm roboczych + specjalny znacznik na: pozycję głowicy ostatnią odwiedzoną komórka na taśmie pozycja na taśmie wejściowej
Czas a pamięć DTIME(f(n)) DSPACE(f(n)) c>0 DTIME(n. c f(n) ) Zatem: L P PSPACE EXPTIME EXPSPACE
Czas a pamięć DTIME(f(n)) DSPACE(f(n)) c>0 DTIME(n. c f(n) ) Zatem: L P PSPACE EXPTIME EXPSPACE Czy te klasy faktycznie są różne? NIE wiadomo, czy: L P P PSPACE PSPACE EXPTIME EXPTIME EXPSPACE Wiadomo (i wkrótce to udowodnimy), że L PSPACE EXPSPACE P EXPTIME
Twierdzenie Sipsera Tw. Rozważmy maszynę M działającą w pamięci S(n), ale bez własności stopu. Wówczas istnieje maszyna M' taka, że: L(M')=L(M) M' działa w pamięci S(n) M' zatrzymuje się na każdym wejściu
Twierdzenie Sipsera Tw. Rozważmy maszynę M działającą w pamięci S(n), ale bez własności stopu. Wówczas istnieje maszyna M' taka, że: L(M')=L(M) M' działa w pamięci S(n) M' zatrzymuje się na każdym wejściu Zatem: w poniższej definicji Język L * jest rozpoznawalny w pamięci S(n) jeśli istnieje maszyna wielotaśmowa mająca własność stopu, akceptująca L w pamięci S(n). ten warunek był zbędny
Twierdzenie Sipsera Tw. Rozważmy maszynę M działającą w pamięci S(n), ale bez własności stopu. Wówczas istnieje maszyna M' taka, że: L(M')=L(M) M' działa w pamięci S(n) M' zatrzymuje się na każdym wejściu Dowód Podejście 1: (w którym wynikowy M' zużywa dużo pamięci) Kluczowa obserwacja: w biegu akceptującym żadna konfiguracja się nie powtarza. po każdym ruchu kopiujemy aktualną konfigurację na dodatkową taśmę roboczą, a także sprawdzamy, czy aktualna konfiguracja jest równa którejś zapisanej wcześniej konfiguracja się powtórzyła pętla odrzucamy
Twierdzenie Sipsera Tw. Rozważmy maszynę M działającą w pamięci S(n), ale bez własności stopu. Wówczas istnieje maszyna M' taka, że: L(M')=L(M) M' działa w pamięci S(n) M' zatrzymuje się na każdym wejściu Dowód Podejście 2: licznik ruchów: bieg akceptujący ma co najwyżej c S(n) kroków, o ile S(n) log(n) aby policzyć do c S(n) wystarczy licznik rozmiaru S(n) więc liczymy, zwiększając licznik o 1 po każdym kroku licznik się przepełnia odrzucamy