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

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 3: Строка 3:
 
Данный алгоритм используется для преобразования НКА в ДКА.
 
Данный алгоритм используется для преобразования НКА в ДКА.
 
Смысл алгоритма состоит в замене множества из <tex>n</tex> состояний НКА, множеством из <tex>2^n</tex> подмножеств его состояний. Но не все из <tex>2^n</tex> состояний будут присутствовать в ДКА, ввиду недостижимости многих из них, поэтому в алгоритме используется обход в ширину.  
 
Смысл алгоритма состоит в замене множества из <tex>n</tex> состояний НКА, множеством из <tex>2^n</tex> подмножеств его состояний. Но не все из <tex>2^n</tex> состояний будут присутствовать в ДКА, ввиду недостижимости многих из них, поэтому в алгоритме используется обход в ширину.  
 
+
===Алгоритм===
 
Вначале в очередь помещается множество состоящее только из стартового состояния НКА <tex>{q_0}</tex>.
 
Вначале в очередь помещается множество состоящее только из стартового состояния НКА <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>P</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>\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>.
 
Так как <tex>|Q_N|</tex> - конечна, а <tex>|Q_D| \le 2^{|Q_N|}</tex>, то алгоритм завершится за конечное число шагов. Отсюда же получается верхняя оценка на время работы алгоритма {{---}} в худшем случае это <tex>O(2^n)</tex>.
 +
===Корректность===
 +
{{Утверждение
 +
|statement=
 +
Построенный автомат принимает тот же язык
 +
|proof=
 +
Применим индукцию по длине слова <tex>\omega</tex>.
 +
* <tex>|\omega|=1</tex>: По построению стартовое состояние ДКА будет <tex>{s}</tex>, где <tex>s</tex> {{---}} стартовое состояние НКА, причем допускать они могут только одновременно.
 +
* Пусть для <tex>|\omega|=n</tex> - это верно, докажем, что верно и для <tex>|\omega|=n+1</tex>:
 +
Пусть НКА на шаге n мог находиться в состояниях <tex>{q_1...q_k}</tex>, тогда ДКА, по построению, находится в состоянии <tex>Q={q_1...q_k}</tex>. После перехода по <tex>\omega[n+1] = с</tex> НКА будет находиться в состояниях <tex>{\delta_N(q_1, c)...\delta_N(q_k, c)}</tex>, а ДКА в состоянии <tex>P=\delta_D(Q, c)</tex>, причем, в силу  построения, оно будет допускающим, когда одно из <>tex{\delta_N(q_1, c)...\delta_N(q_k, c)}</tex> {{---}} допускающее. Что нам и требовалось.
 +
}}

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

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

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

Алгоритм

Вначале в очередь помещается множество состоящее только из стартового состояния НКА [math]{q_0}[/math]. Затем из очереди изымается очередное множество [math]P[/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].

Корректность

Утверждение:
Построенный автомат принимает тот же язык
[math]\triangleright[/math]

Применим индукцию по длине слова [math]\omega[/math].

  • [math]|\omega|=1[/math]: По построению стартовое состояние ДКА будет [math]{s}[/math], где [math]s[/math] — стартовое состояние НКА, причем допускать они могут только одновременно.
  • Пусть для [math]|\omega|=n[/math] - это верно, докажем, что верно и для [math]|\omega|=n+1[/math]:
Пусть НКА на шаге n мог находиться в состояниях [math]{q_1...q_k}[/math], тогда ДКА, по построению, находится в состоянии [math]Q={q_1...q_k}[/math]. После перехода по [math]\omega[n+1] = с[/math] НКА будет находиться в состояниях [math]{\delta_N(q_1, c)...\delta_N(q_k, c)}[/math], а ДКА в состоянии [math]P=\delta_D(Q, c)[/math], причем, в силу построения, оно будет допускающим, когда одно из <>tex{\delta_N(q_1, c)...\delta_N(q_k, c)}</tex> — допускающее. Что нам и требовалось.
[math]\triangleleft[/math]