Построение по НКА эквивалентного ДКА, алгоритм Томпсона — различия между версиями
(→Алгоритм) |
(→Алгоритм Томпсона) |
||
| Строка 60: | Строка 60: | ||
== Алгоритм Томпсона == | == Алгоритм Томпсона == | ||
| − | Данный алгоритм | + | Данный алгоритм преобразовывает НКА в эквивалентный ДКА. |
| − | + | Мы будем использовать предыдущий алгоритм построения с одним дополнением - нам не нужны состояния недостижимые из стартового. | |
| + | |||
| + | Поэтому в алгоритме используется обход в ширину. | ||
| + | |||
===Алгоритм=== | ===Алгоритм=== | ||
| − | + | <tex>Q</tex> - очередь состояний, соответствующих множествам, состоящих из состояний НКА. | |
| − | + | <tex>s</tex> - стартовое состояние НКА. | |
| − | + | <tex>\rightarrow</tex> - положить в очередь. | |
| − | + | <tex>\leftarrow</tex> - достать из очереди. | |
| + | '''1:''' <tex>{s} \rightarrow Q</tex> | ||
| + | '''2:''' while not (isEmpty(<tex>Q</tex>)) { | ||
| + | '''3:''' <tex>q_d \leftarrow Q</tex> | ||
| + | '''4:''' for <tex>c \in \Sigma</tex> { | ||
| + | '''5:''' <tex>p_d = \o</tex> | ||
| + | '''6:''' for <tex>q \in q_d</tex> | ||
| + | '''7:''' <tex>p_d = p_d \cup \delta(q, c)</tex> | ||
| + | '''8:''' if (<tex>p_d</tex> не было в <tex>Q</tex>) | ||
| + | '''9:''' <tex>p_d \rightarrow Q</tex> | ||
| + | '''10:''' } | ||
| + | '''11:''' } | ||
| − | + | Верхняя оценка на работу алгоритмы - <tex>O(n \cdot 2^n)</tex> - так как количество подмножеств множества состояний НКА не более, чем <tex>2^n</tex>, а каждое подмножество мы обрабатываем за <tex>O(n)</tex> и ровно один раз. | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
Версия 22:19, 20 октября 2011
Содержание
Алгоритм систем подмножеств
Данный алгоритм заменяет НКА из состояний на эквивалентный ДКА из состояний.
Алгоритм
Задание состояний:
Состояние нашего ДКА будет соответствовать подмножеству состояний НКА - то есть их будет ровно .
Задание переходов:
Возьмём состояние нашего ДКА , соответствующее подмножеству состояний НКА — , и символ . Тогда , где p - состояние ДКА, соответствующее подмножеству состояний НКА - , где — функция перехода в ДКА, а — функция перехода в НКА.
Задание стартового состояния:
Стартовое состояние - состояние ДКА, соответствующее множеству из одного стартового состояния НКА.
Задание терминальных вершин:
Если в подмножестве состояний НКА есть хотя бы одна терминальная вершина, то вершина ДКА, соответствующая этому подмножеству, будет терминальной.
Терминология:
- состояние НКА.
- состояние ДКА.
- функция перехода в НКА.
- функция перехода в ДКА.
- принадлежит , если множество состояний НКА, соответствующее состоянию , содержит состояние .
Доказательство эквивалентности
| Теорема: |
Построенный ДКА эквивалентен данному НКА. |
| Доказательство: |
|
Докажем, что любое слово, которое принимает НКА, будет принято построенным ДКА. Сделаем наблюдение, что если и символ перехода - , то : . Рассмотрим последовательность состояний НКА, когда принимали слово - - и последовательность состояний ДКА, когда принимали слово - . Мы знаем, что - терминальная, так как НКА принимает слово. Надо доказать, что - терминальная. Заметим, что - так как это стартовые состояния, а, значит, по нашему наблюдению и так далее. Получается, что . Мы знаем, что - терминальная вершина, а, значит, по определению терминальной вершины в нашем ДКА, что - тоже терминальная. Докажем, что любое слово, которое принимает построенный ДКА, принимает и НКА. Рассмотрим последовательность состояний ДКА, когда принимали слово - . Сделаем наблюдение, что если , соответствует множеству из одного элемента - , и мы из него достигли по строке какого-то состояния , то : существует путь из в в НКА по строке . А так как - стартовое состояние, соответствует множеству из одного элемента - - стартовое состояние. Мы из достигли , возьмём любое терминальное состояние - по нашему наблюдению, в НКА есть путь из в по нужной строке, а, значит, что НКА принимает это слово. Получается, что мы доказали, что если НКА принимает слово, равносильно тому, что ДКА его тоже принимает. А это означает, что автоматы эквивалентны. |
Алгоритм Томпсона
Данный алгоритм преобразовывает НКА в эквивалентный ДКА. Мы будем использовать предыдущий алгоритм построения с одним дополнением - нам не нужны состояния недостижимые из стартового.
Поэтому в алгоритме используется обход в ширину.
Алгоритм
- очередь состояний, соответствующих множествам, состоящих из состояний НКА. - стартовое состояние НКА. - положить в очередь. - достать из очереди.
1: 2: while not (isEmpty()) { 3: 4: for { 5: 6: for 7: 8: if ( не было в ) 9: 10: } 11: }
Верхняя оценка на работу алгоритмы - - так как количество подмножеств множества состояний НКА не более, чем , а каждое подмножество мы обрабатываем за и ровно один раз.