Изменения

Перейти к: навигация, поиск
Алгоритм
* '''Шаг 2.''' Затем, пока очередь не пуста выполняем следующие действия:
** Достаем из очереди множество, назовем его <tex>q</tex>
** Для каждого всех <tex>c \in \Sigma</tex> посмотрим в какое состояние ведет переход по этому символу <tex>c</tex> для из каждого состояния из в <tex>q</tex>. Полученное множество состояний положим в очередь <tex>Q</tex> только если оно не лежало там раньше. Каждое такое множество в итоговом ДКА будет отдельной вершиной, в которую будут вести переходы по соответствующим символам.
** Если в множестве <tex>q</tex> хотя бы одна из вершин была терминальной в НКА, то соответствующая данному множеству вершина в ДКА также будет терминальной.
* Конец.
===Алгоритм===
* <tex>\mathtt{P}</tex> {{---}} очередь состояний, соответствующих множествам, состоящих из состояний НКА. * <tex>Q\mathtt{Q_d}</tex> {{---}} массив множеств, соответствующих состояниям ДКА.* <tex>\mathtt{s}</tex> {{---}} стартовое состояние НКА. '''Automaton''' getDFAbyNFA(<tex>\langle \Sigma, Q_0Q, s, T_0T, \delta_0 delta \rangle</tex> : '''Automaton'''): <tex>P</tex>.push(<tex>\{s\}</tex>) <tex>QQ_d</tex> = <tex>\varnothing</tex> '''while''' (<tex>P</tex> <tex> \neq </tex> <tex>\varnothing </tex>)
<tex>P</tex>.pop(<tex>p_d</tex>)
'''for''' (<tex>c</tex> '''\in''' <tex>\Sigma</tex>)
<tex>q_d</tex> = <tex>\varnothing</tex>
'''for''' (<tex>p</tex> '''\in''' <tex>p_d</tex>) <tex>q_d</tex> = <tex>q_d \cup \{ \delta_0delta(p, c) \}</tex> '''if''' <tex>\delta_d(p_d, q_d)</tex> = <tex>q_dc</tex> '''not inif''' <tex>Qq_d \notin Q_d</tex>)
<tex>P</tex>.push(<tex>q_d</tex>)
<tex>QQ_d</tex>.add(<tex>q_d</tex>) <tex>\delta(p_d, q_d)T_d</tex> = <tex>c</tex> '''for''' (<tex>q</tex> '''\{q_d \in''' <tex>Q</tex>) '''if''' (<tex>Q_d \mid \exists q_d</tex> '''p \in''' <tex>qT : p \in q_d</tex> '''in''' <tex>T_0</tex>) <tex>T</tex>.add<tex>(q)\}</tex> '''return''' <tex>\langle \Sigma, QQ_d, \{s\}, TT_d, \delta delta_d \rangle</tex>
===Асимптотика===
Анонимный участник

Навигация