Оскільки ви хочете "конвертувати регулярний вираз в DFA менше ніж за 30 хвилин", я вважаю, що ви працюєте вручну над відносно невеликими прикладами.
У цьому випадку ви можете використовувати алгоритм Бржозовського , який обчислює безпосередньо автомат Нерода мови (який, як відомо, дорівнює його мінімальному детермінованому автомату). Він заснований на прямому обчисленні похідних, а також працює для розширених регулярних виразів, що дозволяють перетинати та доповнювати. Недолік цього алгоритму полягає в тому, що він вимагає перевірити еквівалентність виразів, обчислених по шляху, дорогий процес. Але на практиці і для невеликих прикладів це дуже ефективно.[ 1 ]
Залишені частки . Нехай - мова і - слово. Тоді
Мова називається лівий фактор (або ліва похідна ) з .A ∗ u u - 1 L = { v ∈ A ∗ ∣ u v ∈ L } u - 1 L LLА∗у
у- 1L = { v ∈ A∗∣ u v ∈ L }
у- 1LL
Неродовий автомат . Nerode автомат з є детермінований автомат , де , і функція переходу визначається для кожної за формулою
Остерігайтеся цього досить абстрактного визначення. Кожен стан є лівим коефіцієнтом у слові, а значить, є мовою . Початковий стан - це мова , а набір кінцевих станів - це множина всіх лівих коефіцієнтівA ( L ) = ( Q , A , ⋅ , L , F ) Q = { u - 1 L ∣ u ∈ A ∗ } F = { u - 1 L ∣ u ∈ L } a ∈ A ( u - 1 L ) ⋅ a = a - 1 ( u - 1LА( L ) = ( Q , A , ⋅ , L , F)Q = { u- 1L ∣ u ∈ A∗}Ж= { у- 1L ∣ u ∈ L }a ∈ A
( у- 1L ) ⋅ a = a- 1( у- 1L ) = ( u a )- 1L
АLА∗LL по слову .
L
Алгоритм Бжозовського . Нехай букви - букви. Ліві коефіцієнти можна обчислити за допомогою наступних формул:
а , б
а- 11а- 1( Л1∪ L2)а- 1( Л1∩ L2)= 0= а- 1L1∪ у- 1L2,= а- 1L1∩ у- 1L2,а- 1ба- 1( Л1∖ L2)а- 1L∗= { 10якщо a = bякщо a ≠ b= а- 1L1∖ у- 1L2,= ( а- 1L ) L∗
а- 1( Л1L2)= { ( а- 1L1) L2( a- 1L1) L2∪ а- 1L2si 1 ∉ L1,si 1 ∈ L1
Приклад . Для отримуємо послідовно:
що дає наступний мінімальний автомат.
L = ( a ( a b )∗)∗∪ ( b a )∗
1- 1Lа- 1L1б- 1L1а- 1L2б- 1L2а- 1L3б- 1L3а- 1L4б- 1L4а- 1L5б- 1L5= L = L1= ( a b )∗( a ( a b )∗)∗= L2= a ( b a )∗= L3= b ( a b )∗( a ( a b )∗)∗∪ ( a b )∗( a ( a b )∗)∗= b L2∪ L2= L4= ∅= ( b a )∗= L5= ∅= а- 1( b L2∪ L2) = а- 1L2=L4= b- 1( б)L2∪L2) = L2∪ b- 1L2=L2= ∅= a ( b a)∗=L3
[ 1 ] J. Brzozowski, Похідні від регулярних виразів, J.ACM 11 (4), 481–494, 1964.
Редагувати . (5 квітня 2015 р.) Я щойно виявив подібне запитання: Які алгоритми існують для побудови DFA, який розпізнає мову, описану заданим регулярним виразом? запитали на cstheory. Відповідь частково стосується питань складності.
a(a|ab|ac)*a+
. Ви можете або безпосередньо перевести це на NDFA, який ви зменшите до DFA, або можете нормалізувати його до чогось, що негайно відображається в DFA.