Большинство из нижеприведенного - из теории парсинга Сиппу и Сойсалона-Сойнинена.
Пусть будет множеством состояний DFA. Пусть будет входным алфавитом. Пусть будет размером машины. В упражнении 3.40 приведен алгоритм для минимизации состояния. Как описывает Википедия , алгоритм Хопкрофта имеет время работы а алгоритм Мура имеет время работы ,T | М | = O ( | T | ⋅ | Q | ) O ( | T | ⋅ | Q | 2 ) O ( | T | ⋅ | Q | ⋅ log | T | ) O ( | T | 2 ⋅ | Q | )QT|M|=O(|T|⋅|Q|)O(|T|⋅|Q|2)O(|T|⋅|Q|⋅log|T|)O(|T|2⋅|Q|)
Теорема 3.30 утверждает, что построение подмножества может быть выполнено в давая автомат размера (фактически, если результирующий автомат имеет состояний, время выполнения равно ). Таким образом, два обращения и вторая детерминация несущественны во время выполнения, поэтому асимптотическое время выполнения алгоритма Бжозовского такое же, как и при построении подмножества.O ( 2 | T | + log | Q | ) | Т ′ | ( | T ′ | + | T | ⋅ | M | ) ⋅ | Q |O(2|T|+log|T|+log|Q|)O(2|T|+log|Q|)|T′|(|T′|+|T|⋅|M|)⋅|Q|
Это означает, что в худшем случае алгоритм Бжозовского экспоненциально медленнее, чем три других алгоритма. Обратите внимание, что наихудший случай действительно имеет место: классический пример NFA для языка имеет состояний, а его соответствующий минимальный DFA имеет состояний, тогда как обратный NFA является детерминированным, поэтому выполнение алгоритма Бжозовского на этом обращенном NFA запускает поведение в худшем случае. k + 1 O ( 2 k )(a|b)∗akk+1O(2k)
Однако, если конструкция подмножества дает автоматы размера , то время его работы также равно , что часто имеет место на реальных входах. Кроме того, если при вычислении замыкания состояния будут приняты надлежащие меры, в большинстве случаев это может быть сделано гораздо быстрее (то есть, когда замыкание невелико), сохраняя коэффициентна практике (по той же причине, по которой транзитивные замыкания могут быть вычислены довольно быстро на реальных примерах). Кроме того, если входной и промежуточный автоматы редки, что означает, что состояния имеют мало переходов, то факторсохраняется, что дает время выполнения на «хороших» входах.O ( | T | 2 ⋅ | Q | 2 ) | T | | Q | O ( | T | ⋅ | Q | )|T′|=O(|T|)O(|T|2⋅|Q|2)|T||Q|O(|T|⋅|Q|)
К сожалению, я недостаточно знаком с алгоритмами Хопкрофта или Мура, чтобы анализировать время их работы в типичных случаях. Википедия говорит о времени выполнения в некоторых случаях, что делает эти три алгоритма сопоставимыми.O(|T|loglog|T|)