Алгоритм перетворення дуже великої 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.