Построение по НКА эквивалентного ДКА, алгоритм Томпсона — различия между версиями
(→Построение эквивалентного ДКА по НКА) |
(→Алгоритм Томпсона) |
||
| Строка 46: | Строка 46: | ||
== Алгоритм Томпсона == | == Алгоритм Томпсона == | ||
| − | Данный алгоритм преобразовывает НКА в эквивалентный ДКА. | + | Данный алгоритм преобразовывает НКА в эквивалентный ДКА. Будем использовать вышеуказанный способ построения с одним дополнением {{---}} не будем учитывать состояния недостижимые из стартового. |
| − | |||
| − | |||
Поэтому в алгоритме используется обход в ширину. | Поэтому в алгоритме используется обход в ширину. | ||
===Алгоритм=== | ===Алгоритм=== | ||
| − | <tex>Q</tex> - очередь состояний, соответствующих множествам, состоящих из состояний НКА. | + | <tex>Q</tex> {{---}} очередь состояний, соответствующих множествам, состоящих из состояний НКА. |
| − | <tex>s</tex> - стартовое состояние НКА. | + | <tex>s</tex> {{---}} стартовое состояние НКА. |
| − | + | <tex>Q.push(\{s\})</tex> | |
| − | + | <tex>while</tex> <tex>not</tex> <tex>(isEmpty(Q))</tex> | |
| − | + | <tex>Q.pop(q_d)</tex> | |
| − | + | <tex>for</tex> <tex>c \in \Sigma</tex> | |
| − | + | <tex>p_d = \varnothing</tex> | |
| − | + | <tex>for</tex> <tex>q \in q_d</tex> | |
| − | + | <tex>p_d = p_d \cup \delta(q, c)</tex> | |
| − | + | <tex>if</tex> <tex>(p_d</tex> <tex>haven't</tex> <tex>been</tex> <tex>in</tex> <tex>Q</tex>) | |
| − | + | <tex>Q.push(p_d)</tex> | |
| − | |||
| − | |||
| − | + | ===Асимптотика=== | |
| + | Так как количество подмножеств множества состояний НКА не более, чем <tex>2^n</tex>, а каждое подмножество мы обрабатываем ровно один раз за время <tex>O(n)</tex>, получаем верхнюю оценку времени работы алгоритма {{---}} <tex>O(n \cdot 2^n)</tex>. | ||
Версия 04:07, 25 октября 2011
Содержание
Построение эквивалентного ДКА по НКА
Пусть нам дан произвольный НКА: .
Построим по нему следующий ДКА: , где:
- ,
- ,
- ,
- .
Доказательство эквивалентности
| Теорема: |
Построенный ДКА эквивалентен данному НКА. |
| Доказательство: |
|
Докажем, что любое слово, которое принимает НКА, будет принято построенным ДКА. Заметим, что . Рассмотрим слово , которое принимает автомат НКА: . Проверим, что построенный ДКА тоже принимает это слово. Заметим, что , а, значит, исходя из нашего наблюдения, мы получаем, что , где . Далее, несложно заметить, что , где . Таким образом, , а из определения терминальных состояний в построенном ДКА мы получаем, что , то есть наш ДКА тоже принимает cлово . Докажем, что любое слово, которое принимает построенный ДКА, принимает и НКА. Сначала сделаем наблюдение, что если , и мы из него достигли по строке какого-то состояния , то существует путь из в в НКА по строке . Рассмотрим слово , которое принимает автомат ДКА: . Проверим, что НКА тоже принимает это слово. Так как , и мы из достигли , возьмём любое терминальное состояние . По нашему наблюдению в НКА есть путь из в по строке , а, значит, НКА принимает это слово. Таким образом, множества слов, допускаемых ДКА и НКА совпадают, то есть они эквивалентны. |
Пример
Алгоритм Томпсона
Данный алгоритм преобразовывает НКА в эквивалентный ДКА. Будем использовать вышеуказанный способ построения с одним дополнением — не будем учитывать состояния недостижимые из стартового. Поэтому в алгоритме используется обход в ширину.
Алгоритм
— очередь состояний, соответствующих множествам, состоящих из состояний НКА. — стартовое состояние НКА.
)
Асимптотика
Так как количество подмножеств множества состояний НКА не более, чем , а каждое подмножество мы обрабатываем ровно один раз за время , получаем верхнюю оценку времени работы алгоритма — .
