Построение по НКА эквивалентного ДКА, алгоритм Томпсона — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 2: Строка 2:
 
== Алгоритм Томпсона ==
 
== Алгоритм Томпсона ==
 
Данный алгоритм используется для преобразования НКА в ДКА.
 
Данный алгоритм используется для преобразования НКА в ДКА.
Для построения используются обход в ширину графа переходов.
+
Смысл алгоритма состоит в замене множества из <tex>n</tex> состояний НКА, множеством из <tex>2^n</tex> подмножеств его состояний. Но не все из <tex>2^n</tex> состояний будут присутствовать в ДКА, ввиду недостижимости многих из них, поэтому в алгоритме используется обход в ширину.
Псевдокод:
 
<Цикл по всем состояниям>
 
* <Для всех переходов по одинаковым символам>
 
** <Объединить все состояния, куда они ведут в одно>
 
** <Если такого состояния нет в новом автомате>
 
*** <Добавить>
 
** <Иначе>
 
*** <Направить все переходы на него>
 
  
Так же для реализации можно использовать AVL-деревья
+
Вначале в очередь помещается множество состоящее только из стартового состояния НКА <tex>{q_0}</tex>.
 +
Затем из очереди изымается очередное множество <tex>P</tex> {{---}} новое состояние ДКА. Функция перехода строится по следующему правилу: <tex>\delta_D(P, c) = \bigcup_{q_i \in P}\delta_N(q_i, c)</tex>.<br>
 +
В результате <tex>\delta_D(P, c)</tex> задаст новое состояние <tex>Q</tex> автомата. Если <tex>Q</tex> еще нет в ДКА, тогда мы помещаем <tex>Q</tex> в очередь.
 +
Так как <tex>|Q_N|</tex> - конечна, а <tex>|Q_D| \le 2^{|Q_N|}</tex>, то алгоритм завершится за конечное число шагов. Отсюда же получается верхняя оценка на время работы алгоритма {{---}} в худшем случае это <tex>O(2^n)</tex>.

Версия 18:34, 9 октября 2010

Алгоритм Томпсона

Данный алгоритм используется для преобразования НКА в ДКА. Смысл алгоритма состоит в замене множества из [math]n[/math] состояний НКА, множеством из [math]2^n[/math] подмножеств его состояний. Но не все из [math]2^n[/math] состояний будут присутствовать в ДКА, ввиду недостижимости многих из них, поэтому в алгоритме используется обход в ширину.

Вначале в очередь помещается множество состоящее только из стартового состояния НКА [math]{q_0}[/math]. Затем из очереди изымается очередное множество [math]P[/math] — новое состояние ДКА. Функция перехода строится по следующему правилу: [math]\delta_D(P, c) = \bigcup_{q_i \in P}\delta_N(q_i, c)[/math].
В результате [math]\delta_D(P, c)[/math] задаст новое состояние [math]Q[/math] автомата. Если [math]Q[/math] еще нет в ДКА, тогда мы помещаем [math]Q[/math] в очередь. Так как [math]|Q_N|[/math] - конечна, а [math]|Q_D| \le 2^{|Q_N|}[/math], то алгоритм завершится за конечное число шагов. Отсюда же получается верхняя оценка на время работы алгоритма — в худшем случае это [math]O(2^n)[/math].