Алгоритм перетворення дуже великої NFA в DFA


12

У мене дійсно великий недетермінований кінцевий автомат, і мені потрібно перетворити його в DFA.

Маючи на увазі, я маю на увазі 40 000+ держав. Поки я провів кілька експериментів і запрограмував алгоритм за замовчуванням, який шукає через таблицю (як описано тут ), але навіть після оптимізації досить повільний і дуже багато часу в пам'яті. Мені відомо про той факт, що кількість штатів може зростати експоненціально, але після мінімізації результуюча DFA нараховує близько 9 000 станів, і це нестерпно.

Отже, моє запитання: чи існує якийсь алгоритм, який би був швидшим чи більш зручним для пам'яті?


відео, мабуть, за стандартним визначальним алгоритмом. див., наприклад, мінімізація NFA без визначення,
stackoverflow

Якщо ви виконуєте наївну конверсію NFA-> DFA (використовуючи конструкцію продукту), наскільки великою є отримана DFA? (до мінімізації)
DW

2
Що ви хочете зробити з DFA? Якщо вас цікавлять перевірки включення, існують алгоритми, щоб це зробити безпосередньо.
Vijay D

Дякую за дуже швидкі відповіді. Щодо розміру, я не можу точно сказати з моменту закінчення моєї оперативної пам’яті, але я детальніше ознайомлюсь із цим питанням, а потім продовжую питання. Щодо того, що я хочу зробити, я не впевнений, чи зможу я відкрито поспілкуватися з цим, оскільки це трохи мого твердого ноу-хау. Але я, безумовно, можу констатувати, що насправді мені потрібен DFA.
Jendas

1
Ви спробували запустити алгоритм Angluin для вивчення DFA з запитів про членство та еквівалентність? Частина членства проста (просто запустіть свій DFA на необхідному рядку); для еквівалентності ви можете намалювати безліч випадкових рядків або спробувати всі рядки до певної довжини. Це лише евристика, оскільки ви ніколи не дізнаєтесь, коли закінчите, але я виявив, що цей трюк добре працює на практиці ...
Aryeh

Відповіді:


6

Ви спробували алгоритм Бжозовського ? Найгірший час роботи є експоненціальним, але я бачу деякі посилання, які дозволяють припустити, що він часто працює дуже добре, особливо коли починається з NFA, який потрібно перетворити на DFA і мінімізувати.

Наступний документ здається актуальним:

Він оцінює декілька різних алгоритмів мінімізації DFA, включаючи їх застосування до вашої ситуації, коли ми починаємо з NFA і хочемо перетворити його в DFA та мінімізувати його.

Як виглядає сильно пов'язаний компонент (SCC) розкладання вашої NFA (розглядаючи це як спрямований графік)? Чи є в ній багато компонентів, де жоден з компонентів не надто великий? Якщо так, то мені цікаво, чи можливо було б розробити алгоритм ділення і перемоги, де ви берете один компонент, перетворюєте його з NFA в DFA і потім мінімізуєте його, а потім замінюєте оригінал новою визначеною версією. Це повинно бути можливим для компонентів з одним входом (де всі краї в цьому компоненті ведуть до однієї вершини, вершини введення). Я не одразу бачу, чи можна було б зробити щось подібне для довільних NFA, але якщо ви перевірите, як виглядає структура SCC, то, можливо, ви зможете визначити, чи варто цей напрямок вивчити чи ні .


Алгоритм Бржозовського здається багатообіцяючим, але техніка розділення та підкорення ще більше! У моєму випадку це зробити дуже просто і не потребує великих змін коду. Я це зроблю, і якщо це спрацює, я прийму вашу відповідь.
Jendas

2
Я прийшов, запитав, розділився, я підкорив
Jendas

2

це, мабуть, не дуже добре вивчена проблема в розумінні відомих / доступних алгоритмів, відмінних від оригінальної / давньої стратегії "визначити в DFA / мінімізувати DFA". Ви, схоже, вказуєте, що крок визначення є проблематичним, але це, звичайно, з огляду на те, що він має гірший випадок для експоненціального простору / часу. зауважте, що існує декілька алгоритмів мінімізації DFA, які можуть в середньому значно відрізнятися за продуктивністю.

він також більш неофіційно відомий як "мінімізація NFA без визначення" . відомо, що важко в тому сенсі, що в основному не існує навіть алгоритмів наближення, якщо тільки P = Pspace, як показано в цій статті:

однак у цій роботі розглядається загалом рідко досліджуваний випадок деяких алгоритмів, які не ґрунтуються на знаходженні визначеного коефіцієнта DFA 1- го :

Ми представляємо різні методики зменшення кількості станів і переходів у недетермінованих автоматах. Ці прийоми ґрунтуються на двох передпорядках щодо набору станів, пов’язаних із включенням лівої та правої мов. Оскільки їх точне обчислення є важким для NP, ми зосередимось на поліноміальних наближеннях, які дозволяють все одно зменшити NFA.

зауважте, що загальнодоступний пакет / реалізація, яка може обробляти великі NFA / DFA конверсії / мінімізацію тощо, як правило, максимально ефективно, це бібліотека AT&T FSM .

у неї є стратегія, fsmcompactяка іноді може бути достатньою:

У випадках, коли перетворювач або зважений акцептор неможливо визначити або зростає дуже великим, може бути корисна інша оптимізація - fsmcompact. Ця операція кодує кожну трійку вхідної мітки, вихідної мітки та вартості в одну нову мітку, виконує класичне (не зважене акцептором) визначення та мінімізацію, а потім декодує закодовані мітки назад у їх початкові значення. Це має перевагу в тому, що вона завжди визначена, і те, що вона не переміщує мітки виводу або витрати по трасах. Недоліком є ​​те, що результат не може бути ні детермінованим, ні мінімальним.


дивіться також Про скорочення NFA Ilie, Navarro, Yu
vzn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.