Złożoność obliczeniowa (bioinformatyka) Egzamin 8 lutego 2021
1. Jeśli w ∈ {a, b}
∗, to przez w oznaczymy słowo powstające przez zamianę wszystkich liter a na b i wszystkich b na a. Na przykład jeśli w = ababb, to w = babaa. Które z następujących języków są regularne, a które są bezkontekstowe?
(a) L
1= {w
Rw | w ∈ {a, b}
∗};
(b) L
2= {ww | w ∈ {a, b}
∗};
2. Czy języki L
1i L
2z zadania 1 są rozstrzygalne? Do jakich należą klas złożoności? Czy to możliwe, że któryś z nich jest P-zupełny? NP-zupełny? Pspace-zupełny? Co by z tego wynikało?
3. Które z następujących zawierań: CSL ⊆ Dspace(n
2log n) ⊆ Nspace(n log log n) ⊆ P
(gdzie CSL oznacza klasę języków kontekstowych) faktycznie zachodzą, które nie za-
chodzą, a które implikują równość Pspace = P?
Przykładowe rozwiązania
1a: Elementy języka L1to wszystkie słowa postaci x1x2. . . xnxn. . . x2x1, gdzie x1, x2, . . . , xn∈ {a, b}.
Ten język jest bezkontekstowy. Generuje go taka gramatyka: ξ0::= ε | aξ0b | bξ0a . Ale nie jest regularny. W przeciwnym razie iloczyn L01= L1∩ a+bab+= {anbabn | n, k > 0} też byłby regularny.
A ten jezyk nie da się pompować: jeśli N jest stałą z lematu o pompowaniu, to trzeba podzielić słowo aNbabN na trzy części x, y, z i to tak że |xy| ≤ N , czyli segment y ma postać ad, dla pewnego d > 0.
Wtedy xy2z = aN +dbabN 6∈ L01, bo liczba liter w pierwszej i ostatniej części się nie zgadza.
1b: Ten język nie jest bezkontekstowy. Gdyby był, to język
L02= L1∩ a+b+a+b+a+b+= {anbmakbnambk | n, m, k > 0}
też byłby bezkontekstowy, a nie jest. Użyjemy lematu o pompowaniu: niech N będzie stałą z lematu i niech aNbNaNbNaNbN = xyzuv, gdzie |yzu| ≤ N , yu 6= ε. Słowo yzu mieści w jednym z segmentów postaci aNbN lub postaci bNaN. Przy tym słowo y zbudowane jest z samych a lub samych b i tak samo słowo u – inaczej słowo xy2zu2v ma za dużo alternacji liter i nie należy do L02. Ale wtedy xzv 6∈ L02, bo któraś z sześciu części jest w nim za krótka.
2: Język L1 należy do klasy Dtime(O(n)), bo można go rozpoznawać maszyną, która czytając słowo wejściowe w zapisuje w na taśmie roboczej, a następnie porównuje taśmy czytając je w przeciwne strony (tutaj korzystamy z tego, że L1= {w | w = wR}). Możemy też zauważyć, że L1∈ Logspace, bo zamiast słowo kopiować (co wymaga pamięci liniowej) można porównywać poszczególne litery, posługując się licznikami rozmiaru log n. Podobnie jak L1, także język L2należy do klas Dtime(O(n)) i Logspace. Tym razem algorytmy są nieco bardziej kłopotliwe, trzeba bowiem (deterministycznie) odnaleźć środek słowa (czyli obliczyć 12n) i porównywać połówki czytając obie od lewej do prawej.
Liczbę12n można jednak ustalić z pomocą jednego licznika w czasie liniowym: czytamy słowo wejściowe, dodając jedynkę do licznika co dwa kroki. Skoro języki L1i L2mają określoną złożoność, to oczywiście są rozstrzygalne. Gdyby któryś z nich okazał się zupełny w klasie P lub NP (czego nie wiadomo), to wtedy cała klasa P (odpowiednio NP) byłaby równa klasie Logspace. Ale nasze języki na pewno nie są zupełne w Pspace, bo wiadomo, że Logspace 6= Pspace.
3: Ponieważ CSL = Nspace(n) ⊆ Dspace(n2) z twierdzenia Savitcha, więc tym bardziej zachodzi pierwsza inkluzja w zadaniu. Druga nie zachodzi, bo z tegoż twierdzenia Savitcha i z tego, że limn→∞ (log log n)2
log n = 0 wynika, że Nspace(n log log n) ⊆ Dspace(n2(log log n)2) Dspace(n2log n).
Pozostaje pokazać, że jeśli Nspace(n log log n) ⊆ P, to Pspace = P. Niech więc L ∈ Pspace, powiedzmy, że L ∈ Nspace(nk). „Wypychamy” język L, aby dostać język L0 należący do klasy Nspace(n log log n). Można to zrobić tak: L0= {w$...$ | w ∈ L oraz |w$...$| = |w|k}. Maszynę, która rozpoznawała język L w pamięci nk można łatwo przerobić na maszynę rozpoznającą L0 w pamięci liniowej (liczonej od N = nk). Zatem L0 ∈ Nspace(n) ⊆ Nspace(n log log n) ⊆ P, czyli mamy de- terministyczną maszynę rozpoznającą język L0 w czasie wielomianowym, powiedzmy nr. Pozostaje ją przerobić na taką maszynę M , że L = L(M ), która działa w wielomianowym czasie Nr= nkr.