Если у вас есть DFA с m узлами, и вы запускаете его на строку с n символами, на каждом шаге вам нужно не только проверять состояния, унаследованные от предыдущего шага но и первое состояние DFA. Таким образом, после символа m в строке (предполагая m < n) наихудший сценарий состоит в том, что вы должны проверить состояние mn actives (каждому состоянию нужно только один поиск для продвижения или отклонения).Продолжительность DFA не O (n), но O (nm)
В качестве примера рассмотрим {l} b регулярное выражение (все слова, начинающиеся с повторяющихся l раз, следуют ab), его DFA имеет m = 1 + 1 узел. Согласование его с строкой a {k} b с k> l означает, что вы столкнетесь с наихудшим сценарием наличия (m - 1) активных состояний после l символов в строке.
Что я пропустил? Литература вручную наводит практическую реализацию только на теоретический вопрос о знании того, соответствует ли заданная полная строка (т. Е. Не одна из ее подстроки) регулярному выражению.
С того места, где я работаю, NFA или DFA будут занимать O (нм) раз (при этом m является числом узлов в NFA или DFA и n числом символов). Единственное, что NFA имеет больше узлов, чем DFA.
Я смотрел на это в контексте регулярного выражения, и я не думал об уловке добавления Σ * в DFA, чтобы он мог найти соответствие подстроки. Это дает O (n), я наивно думал о необходимости повторного тестирования первого состояния DFA для каждого персонажа. – Glisse