Mam naprawdę duży niedeterministyczny automat skończony i muszę go przekonwertować na DFA.
Przez duże rozumiem ponad 40 000 stanów. Do tej pory przeprowadziłem kilka eksperymentów i zaprogramowałem domyślny algorytm, który przeszukuje tabelę (jak opisano tutaj ), ale nawet po optymalizacji jest dość powolny i bardzo zajmuje pamięć. Zdaję sobie sprawę z tego, że liczba stanów może rosnąć wykładniczo, ale po zminimalizowaniu wynikowy DFA ma około 9 000 stanów i jest to możliwe.
Moje pytanie brzmi: czy istnieje jakiś algorytm, który byłby szybszy lub bardziej przyjazny dla pamięci?
Odpowiedzi:
Czy próbowałeś algorytmu Brzozowskiego ? W najgorszym przypadku czas działania jest wykładniczy, ale widzę pewne referencje sugerujące, że często działa bardzo dobrze, szczególnie gdy zaczynasz od NFA, który chcesz przekonwertować na DFA i zminimalizować.
Wydaje się, że następujący artykuł:
Ocenia szereg różnych algorytmów minimalizacji DFA, w tym ich zastosowanie do sytuacji, w której zaczynamy od NFA i chcemy przekonwertować go na DFA i zminimalizować.
Jak wygląda rozkład silnie połączonych komponentów (SCC) twojego NFA (biorąc pod uwagę, że jest to wykres kierowany)? Czy ma wiele elementów, z których żaden nie jest zbyt duży? Jeśli tak, zastanawiam się, czy można opracować algorytm dzielenia i zdobywania, w którym bierzesz pojedynczy komponent, konwertujesz go z NFA na DFA, a następnie minimalizujesz, a następnie zastępujesz oryginał nową, określoną wersją. Powinno to być możliwe w przypadku komponentów z jednym wejściem (gdy wszystkie krawędzie tego komponentu prowadzą do pojedynczego wierzchołka, wierzchołka wejściowego). Nie od razu widzę, czy byłoby możliwe zrobienie czegoś takiego dla arbitralnych NFA, ale jeśli sprawdzisz, jak wygląda struktura SCC, możesz być w stanie ustalić, czy ten kierunek warto zbadać, czy nie .
źródło
najwyraźniej nie jest to dobrze zbadany problem w sensie znanych / dostępnych algorytmów innych niż pierwotna / dawna strategia „określania na DFA / minimalizowania DFA”. wydaje się, że wskazujesz, że etap determinacji jest problematyczny, ale jest to typowe, oczywiście biorąc pod uwagę, że ma on gorszy przypadek wykładniczo-przestrzenno-czasowy. należy pamiętać, że istnieje kilka algorytmów minimalizacji DFA, które mogą znacznie różnić się wydajnością średnio.
jest również znany bardziej nieformalnie jako „minimalizacja NFA bez determinacji” . wiadomo, że jest trudne w tym sensie, że w zasadzie nie ma nawet algorytmów aproksymacyjnych, chyba że P = Pspace, jak pokazano w tym artykule:
Jednak dokument ten uważa się na ogół rzadko zbadane przypadku niektórych algorytmów, które nie są oparte na znalezienie determinized DFA 1 st :
zwróć uwagę na publicznie dostępny pakiet / implementację, który może obsługiwać duże konwersje / minimalizacje NFA / DFA itp., na ogół tak skutecznie, jak to możliwe, to biblioteka AT&T FSM .
ma strategię,
fsmcompact
która czasem może wystarczyć:źródło