Czy istnieją „małe” maszyny, które mogą skutecznie dopasowywać wyrażenia regularne?


30

Dobrze wiadomo, że wyrażenie regularne może zostać rozpoznane przez niedeterministyczny automat skończony o wielkości proporcjonalnej do wyrażenia regularnego lub przez deterministyczny FA, ​​który jest potencjalnie większy wykładniczo. Ponadto, biorąc pod uwagę ciąg i wyrażenie regularne , NFA może przetestować członkostwo w czasie proporcjonalnym do | s | \ cdot | r | , a DFA może przetestować członkostwo w czasie proporcjonalnym do | s | . Spowolnienie dla NFA wynika z faktu, że zasadniczo musimy śledzić zestawy możliwych stanów, w których może znajdować się automat, a wykładniczy wybuch dla DFA wynika z faktu, że jego stany są elementami zestawu sił stanów NFA.r | s | | r | | s |sr|s||r||s|

Czy jest możliwe efektywne (tj. Z czasem lepsze niż O(|r||s|) i lepsze miejsce niż O(2|r|) ) rozpoznawanie wyrażeń regularnych, jeśli pozwolimy na użycie mocniejszych maszyn niż skończone automaty? (Na przykład, czy są zwięzłe korzyści w rozpoznawaniu zwykłych języków za pomocą automatów pushdown lub liczników?)


2
Kiedy mówisz, że „NFA może przetestować członkostwo w czasie proporcjonalnym do ” masz na myśli, że (deterministyczna) pamięć RAM, która w oczywisty sposób symuluje NFA, zajmuje tyle czasu? Czy jest jakiś inny sposób zdefiniowania „czasu działania NFA”, który nie odnosi się do innego modelu obliczeniowego? (Poza rozsądną, ale niezbyt przydatną definicją, która mówi, że środowisko wykonawcze dowolnego NFA dla łańcucha to .)s | s ||s||r|s|s|
Radu GRIGore

Tak, to właściwa interpretacja mojego pytania.
Neel Krishnaswami,

2
Wtedy wydaje mi się bardziej naturalne pytanie: Czy istnieje algorytm (na maszynie RAM), który decyduje, czy łańcuch jest w języku zdefiniowanym przez wyrażenie regularne które działa w czas przestrzeń? (Zwłaszcza jeśli zdefiniować czas pracy do automatów ze stosem także pod względem maszynie RAM.)r o ( | s || r | ) o ( 2 | r | )sro(|s||r|)o(2|r|)
Radu GRIGORE

1
Nie rozumiem dokładnie problemu. Czy wejście jest ciągiem s i wyrażeniem regularnym r, a problemem jest decyzja, czy s jest w języku zdefiniowanym przez wyrażenie regularne r?
Robin Kothari,

@Robin: tak, to wszystko. Chciałbym wiedzieć, czy można dopasować wyrażenia regularne bardziej efektywnie niż automaty skończone, używając większej mocy obliczeniowej, czy też dodatkowe funkcje (np. Stos, pamięć RAM) po prostu nie pomagają.
Neel Krishnaswami,

Odpowiedzi:


20

Łatwo jest wymienić czas na przestrzeń w następujący sposób.

Konwertuj wyrażenie regularne na NFA - dla konkretności przy porównywaniu algorytmów założymy, że jest liczbą stanów NFA, więc twój czas O ( r s ) związany z bezpośrednią symulacją NFA jest prawidłowy, a twój O ( 2 r ) przestrzeń związana z uruchomieniem przekonwertowanego DFA jest również ważna za każdym razem, gdy pracujesz w pamięci RAM, która może zająć tak dużo pamięci.rO(rs)O(2r)

Teraz podzielić stany NFA (arbitralnie) do podzbiorów S I co najwyżej r / k Zjednoczonych każdego. W obrębie każdego podzbioru Ś I , można podzbiory indeks I z S ı liczbami od 0 do 2 R / K - 1 .kSir/kSiAiSi02r/k1

Zbuduj tabelę gdzie i oraz j mieszczą się w zakresie od 0 do k - 1 , c jest symbolem wejściowym, a A i jest (indeks numeryczny) podzbiorem S i . Wartości przechowywane w tabeli oznacza (wskaźnik liczbowy) podzbiór S j : stan Y jest T [ ı , j , c , A ı ] wtedy i tylko wtedy, gdyT[i,j,c,Ai]ijk1cAiSiSjyT.[ja,jot,do,ZAja] należy do S j a jest to stan, w A, i który przechodzi do Y na symbol wejściowy C .yS.jotZAjaydo

Aby symulować NFA, utrzymania indeksy, po jednym dla każdego S I , określając podgrupie A ja z państw, w S í do których można dotrzeć za pośrednictwem prefiksu wejścia. Dla każdego symbolu wejściowego , c , za pomocą tabel sprawdzić dla każdej pary i , j , zestaw stanów w S j , który może być osiągnięty ze stanu w A ı przez przejście na C , a następnie użycie binarnego logicznym OR operacja na wskaźnikach liczbowych tych zestawów stanów, aby połączyć je w jeden podzbiór stanów S jkS.jaZAjaS.jadoja,jotS.jotZAjadoS.jot. Zatem każdy etap symulacji wymaga czasu , a całkowity czas symulacji wynosi O ( s k 2 ) .O(k2))O(sk2))

Wymagane miejsce to miejsce dla wszystkich tabel, którym jest . Analiza czasu i przestrzeni obowiązuje dla każdej pamięci RAM, która może zająć tak dużo pamięci i która może wykonywać operacje binarne na słowach, które są wystarczająco duże, aby zająć taką pamięć.O(k2)2)r/k)

Wynikający z tego kompromis czasoprzestrzenny nie pasuje idealnie do symulacji NFA, z powodu kwadratowej zależności od . Ale potem, jestem sceptyczny, że O ( r s ) jest właściwy czas związany do symulacji NFA: jak można symulować jeden krok NFA szybciej niż patrząc na wszystko z (wielu) kwadratowo ewentualnie przejść dozwolonych od aktualnie stan aktywny do innego stanu? Czy nie powinno to być O ( r 2 s ) ?kO(rs)O(r2)s)

W każdym przypadku, pozwalając zmieniać, możesz uzyskać ograniczenia czasowe na kontinuum między granicami DFA i NFA, z mniejszą ilością miejsca niż DFA.k


Myślę, że twoja korekta jest poprawna, a twoja odpowiedź odpowiada na moje zadane pytanie. Jednak pytanie, które chciałem zadać, brzmi: ile dodatkowej mocy obliczeniowej pomaga. (Np. Za pomocą licznika możesz dopasować ciąg w przestrzeni O (1).) Jeśli nie masz nic przeciwko, zostawię pytanie na chwilę dłużej, aby sprawdzić, czy ktoś zna odpowiedź na to pytanie. ...ak
Neel Krishnaswami,

@Neel: Jeśli rozwiązanie Davida jest najlepsze, co potrafi pamięć RAM, to stosy, liczniki itp. Nie pomogą. (Ale oczywiście podał tylko górne granice, a nie dolne granice.)
Radu GRIGore

1
O ile wiem, moje rozwiązanie wykorzystuje „dodatkową moc”: opiera się na przeglądach tabel i indeksach liczb całkowitych, co jest niedostępne w modelach DFA lub NFA. Więc tak naprawdę nie rozumiem, w jaki sposób nie odpowiada na tę część pytania.
David Eppstein,

Oto alternatywny sposób na sparametryzowanie tego. Załóżmy, że jesteśmy na maszynie RAM o szerokości słowa , gdzie w lg r . Następnie symulacja NFA zajmuje czas O ( s r 2 ) i przestrzeń O ( r / w ) . Symulacja DFA nie jest możliwa, jeśli r w (za mało dostępnego miejsca). Konstrukcja w tej odpowiedzi ustawia k r / w i przyjmuje O ( s r 2 / w 2wwlgrO(sr2))O(r/w)rwkr/w czas i zużywa całą dostępną przestrzeń (tj. coś w pobliżu przestrzeni 2 w ). Zasadniczo wykorzystuje równoległość bitów dostępną w maszynie RAM, aby szybciej przeprowadzić symulację NFA. O(sr2)/w2))2)w
DW

4

To nie jest odpowiedź, ale za długa na komentarz. Próbuję wyjaśnić, dlaczego postawione pytanie może być trudne do zrozumienia.

Istnieją dwa sposoby definiowania złożoności obliczeniowej dla urządzenia o X .

Pierwszy i najbardziej naturalny sposób jest nieodłączny . Trzeba powiedzieć, w jaki sposób urządzenie X wykorzystuje dane wejściowe, abyśmy mogli później przyjrzeć się, jak rozmiar n danych wejściowych wpływa na czas działania urządzenia. Trzeba też powiedzieć, co liczy się jako operacja (lub krok ). Następnie po prostu pozwalamy, aby urządzenie działało na operacjach wprowadzania i zliczania.

O(fa(n))fa(n)

Na przykład wewnętrzna definicja NFA mówi, że przetworzenie ciągu o długości n wymaga n kroków ; zewnętrzna definicja, która używa maszyny RAM jako urządzenia Y, mówi, że najlepiej znana górna granica to prawdopodobnie odpowiedź Davida Eppsteina. (W przeciwnym razie byłoby dziwne, że (1) najlepsza praktyczna implementacja wskazana w drugiej odpowiedzi nie korzysta z lepszej alternatywy i (2) nikt tutaj nie wskazał lepszej alternatywy.) Zauważ też, że ściśle mówiąc, twoje urządzenie X jest wyrażeniem regularnym , ale ponieważ NFA ma ten sam rozmiar, można go bezpiecznie traktować jako urządzenie X , na które patrzysz.

Ω(fa(n))

W pewnym sensie najlepszą odpowiedzią, na jaką można mieć nadzieję, jest dowód w czymś takim jak model sondy komórkowej, że symulacja NFA wymaga pewnego czasu. (Pamiętaj, że jeśli weźmiesz pod uwagę konwersję NFA do DFA, potrzebujesz czasu na spisanie dużego DFA, więc pamięć nie jest jedynym problemem.)


4

Nawet jeśli uważasz, że nie ma nic nowego ani starego do nauczenia się w dopasowywaniu wyrażeń regularnych, sprawdź jeden z najpiękniejszych artykułów, na które natknąłem się od dawna: gra wyrażeń regularnych S Fischera, F Hucha i T Wilke, ICFP 2010.

(MMT Chakravarty zasługuje na uznanie za rekomendację tego artykułu).

EDYCJA: Powodem, dla którego ten artykuł jest istotny, jest to, że opisuje nową technikę (opartą na Glushkovie z lat 60.), która pozwala uniknąć budowy pełnego NFA (nie mówiąc już o DFA) odpowiadającego RE. To, co jest zrobione, przypomina uruchomienie algorytmu znakowania podobnego do znanego do decydowania o przyjęciu słowa przez NFA w drzewie składni RE. Pomiary wydajności sugerują, że jest to konkurencyjne, nawet w niedawno opublikowanej bibliotece Google re2.


Niezły artykuł do przeczytania !!
Hsien-Chih Chang 張顯 之

1

Spójrz na ten artykuł Russ Cox. Opisuje podejście oparte na NFA, po raz pierwszy zastosowane przez Kena Thompsona, za pomocą którego ciąg wejściowy s można dopasować do wyrażenia regularnego rw czasie O (| s | .c ) i spacji O (| r |. D ), gdzie c i d są stałymi górnymi. Artykuł szczegółowo opisuje implementację techniki w języku C.


2
Nie jestem przekonany, że to dokładny opis artykułu. Wydaje się, że buduje DFA z NFA w miarę potrzeb i buforuje wyniki. Ale rozmiar pamięci podręcznej może być wykładniczy wr.
David Eppstein,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.