Недетермінірованного кінцевий автомат є кінцевим автоматом , де кортеж відображаються в декількох штатів. Тобто ми замінюємо звичайну функцію переходу DFA на іншу функцію .
Якщо ви знаєте, що таке NFA, можливо, ви захочете пропустити наступний розділ.
Формальне визначення
NFA унікально описано
- кінцевий набір станів
- кінцевий набір символів
- функція переходу
- початковий стан
- сукупність кінцевих станів
Машина запускається в і зчитує кінцевий рядок символів w ∈ Σ ∗ , для кожного символу він одночасно застосує функцію функції переходу з поточним станом і додасть кожен новий набір станів до набору поточних станів.
Виклик
Для цього завдання ми будемо ігнорувати , щоб спростити його, крім того, алфавіт буде завжди (рядкові) літери до г і безлічі станів буде { 0 ... N } для деякого цілого невід'ємного числа N . Початковий стан завжди буде 0 .
Давши слово та опис NFA, ваше завдання - визначити всі кінцеві стани.
Приклад
Розглянемо рядок та наступний опис:
state, symbol, new-states
0, 'a', [1]
1, 'a', [0]
1, 'b', [1,2]
Машина запуститься в :
- читати : нові стани { 1 }
- read a : нові стани { 1 , 2 }
- читати : нові стани { 0 }
- читати : нові стани { 1 }
- read a : нові стани { 1 , 2 }
Отже, кінцеві стани і, таким чином, вихід будуть .
Примітка: На кроці (2) перехід стану відображається у ∅, оскільки опис включає лише переходи до не порожніх множин.
Правила
Вхід буде складатися з рядка та якогось опису NFA (без -переходів):
- рядок вводу завжди буде елементом
- дійсні входи (не обмежуються):
- список / масив кортежів / списків
- новий рядковий вхід
- опис NFA буде містити лише переходи з не порожніми наборами як результат
- ви можете скоротити правила з тими самими символами, якщо їх результат однаковий (наприклад, правила
0,'a',[1,2]
і0,'b',[1,2]
може бути скорочений0,"ab",[1,2]
- ви можете прийняти кожне правило окремо (наприклад, правило
0,'a',[1,2]
може бути0,'a',[1]
і0,'a',[2]
)
- ви можете скоротити правила з тими самими символами, якщо їх результат однаковий (наприклад, правила
- Ви можете вибрати великі літери, якщо хочете
- ви можете взяти кількість станів як вхідні дані
- Ви можете припустити якесь упорядкування входів (наприклад, упорядковано за станом чи символами)
Виходом буде список / набір / розділений новий рядок вихідний і т.д. кінцевих станів
- порядок не має значення
- без дублікатів (оскільки це набір)
Тестові справи
Ці приклади будуть у форматі, description word -> states
де description
є список кортежів (state,symbol,new-states)
:
[] "x" -> []
[] "" -> [0]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abaab" -> [1,2]
[(0,'a',[1]),(1,'a',[0]),(1,'b',[1,2])] "abc" -> []
[(0,'p',[0,1]),(0,'g',[2]),(1,'c',[1]),(1,'g',[4]),(1,'p',[2]),(2,'c',[0])] "ppcg" -> [2,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fooooooobar" -> [0,4]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "fobarfo" -> [1,2]
[(0,'f',[1]),(1,'o',[1,2]),(2,'b',[3]),(3,'a',[4]),(4,'r',[0,4])] "foobarrf" -> [1]
[(0,'d',[1,2]),(1,'u',[2]),(2,'u',[2,3]),(2,'p',[3]),(3,'p',[3])] "dup" -> [3]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "aab" -> [3,1,4]
[(0,'a',[0,2]),(0,'b',[3]),(1,'a',[1]),(1,'b',[1]),(2,'b',[1,4]),(4,'b',[2])] "abb" -> [1,2]