Рассмотрим алгоритм построения по недетерминированному конечному автомату детерминированного конечного автомата, допускающего тот же язык.
Алгоритм 3.2. Построение детерминированного конечного автомата по недетерминированному.
Вход. НКА M = (Q, T, D, q0, F).
Выход. ДКА M' = (Q', T, D', q0', F'), такой что L(M) = L(M').
Метод. Каждое состояние результирующего ДКА - это некоторое множество состояний исходного НКА.
В алгоритме будут использоваться следующие функции:
e-closure(R) (R


move(R, a) (R


Вначале Q' и D' пусты. Выполнить шаги 1-4:
while (в Q' есть непомеченное состояние R){
пометить R;
for (каждого входного символа a

S = e-closure(move(R, a));
if (S


if (S

добавить S в Q' как непомеченное состояние;
определить D'(R, a) = S;
}
}
}




Пример 3.6. Результат применения алгоритма 3.2 приведен на рис. 3.10.
![]()
|
Приведем теперь алгоритм построения по регулярному выражению детерминированного конечного автомата, допускающего тот же язык[10].
Пусть дано регулярное выражение r в алфавите T. К регулярному выражению r добавим маркер конца: (r)#. Такое регулярное выражение будем называть пополненным. В процессе своей работы алгоритм будет использовать пополненное регулярное выражение.
Алгоритм будет
оперировать с синтаксическим деревом для пополненного регулярного выражения (r)# , каждый лист которого помечен символом a


(конкатенация), | (объединение), * (итерация).
Каждому листу дерева (кроме e-листьев) припишем уникальный номер, называемый позицией, и будем использовать его, с одной стороны, для ссылки на лист в дереве, и, с другой стороны, для ссылки на символ, соответствующий этому листу. Заметим, что если некоторый символ
используется в регулярном выражении несколько раз, он имеет несколько позиций.
Теперь, обходя дерево T снизу-вверх слева-направо, вычислим четыре функции: nullable, firstpos, lastpos и followpos. Функции nullable, firstpos и lastpos определены на узлах дерева, а followpos - на множестве позиций. Значением всех функций, кроме nullable, является множество позиций. Функция followpos вычисляется через три остальные функции.
Функция firstpos(n) для каждого узла n синтаксического дерева регулярного выражения дает множество позиций, которые соответствуют
первым символам в подцепочках, генерируемых подвыражением с вершиной в n. Аналогично, lastpos(n) дает множество позиций, которым соответствуют последние символы в подцепочках, генерируемых подвыражениями с вершиной n. Для узла n, поддеревья которого (т.е. деревья, у которых узел n является корнем) могут породить пустое слово, определим nullable(n) = true, а для остальных узлов nullable(n) = false.
Таблица для вычисления функций nullable, firstpos и lastpos приведена на рис. 3.11.
![]()
|
Пример 3.7.
Рассмотрим теперь алгоритм построения ДКА с минимальным числом состояний, эквивалентного данному ДКА [10].
Пусть M = (Q, T, D, q0, F) - ДКА. Будем называть M всюду определенным, если D(q, a)




Лемма. Пусть M = (Q, T, D, q0, F) - ДКА, не являющийся всюду определенным. Существует всюду определенный ДКА M', такой что L(M) = L(M'). Доказательство. Рассмотрим автомат M' = (Q


состояние, а функция D' определяется следующим образом:

Q и a




Q и a



T определить D'(q', a) = q'.
Легко показать, что автомат M' допускает тот же язык, что и M. __
Приведенный ниже алгоритм получает на входе всюду определенный автомат. Если автомат не является всюду определенным, его можно сделать таковым на основании только что приведенной леммы.
Алгоритм 3.4. Построение ДКА с минимальным числом состояний.
Вход. Всюду определенный ДКА M = (Q, T, D, q0, F).
Выход. ДКА M' = (Q', T, D', q0', F'), такой что L(M) = L(M') и M' содержит наименьшее возможное число состояний.
Метод. Выполнить шаги 1-5:




for (каждой группы G в

разбить G на подгруппы
так, чтобы
состояния s и t из G оказались
в одной подгруппе тогда и только тогда,
когда для каждого входного символа a
состояния s и t имеют переходы по a
в состояния из одной и той же группы в

заменить G в

полученных подгрупп;
}







Q' = {G1, ..., Gn};
q0' = G, где группа G


F' = {G|G




D'(p', a) = q', если D(p, a) = q, где p


Таким образом, каждая группа в

![]()
|
![]()
|





![]()
|

![]()
|