Алгоритм Бржозовского — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Заключение: обновил ссылку)
Строка 2: Строка 2:
 
|definition =  
 
|definition =  
 
Пусть дан [[Детерминированные_конечные_автоматы|автомат]] <tex>\mathcal{A}</tex>. Требуется построить автомат <tex>\mathcal{A}_{min}</tex> с наименьшим количеством состояний, распознающий тот же язык, что и <tex>\mathcal{A}</tex>.
 
Пусть дан [[Детерминированные_конечные_автоматы|автомат]] <tex>\mathcal{A}</tex>. Требуется построить автомат <tex>\mathcal{A}_{min}</tex> с наименьшим количеством состояний, распознающий тот же язык, что и <tex>\mathcal{A}</tex>.
 +
}}
 +
 +
==Описание==
 +
Пусть <tex>q</tex> {{---}} состояние автомата <tex>\mathcal{A} = \langle \Sigma , Q, s \in Q, T \subset Q, \delta : Q \times \Sigma \to Q \rangle</tex>.
 +
{{Определение
 +
|definition=
 +
'''Правым языком''' (англ. ''right language'') {{---}} называется язык <tex>L_d(q)</tex>, принимаемый автоматом <tex>\mathcal{A}_{d}(q) = \langle \Sigma , Q , q , T , \delta \rangle</tex>, полученным из <tex>\mathcal{A}</tex> путём добавления уникального начального состояния <tex>q</tex>.
 +
}}
 +
{{Определение
 +
|definition=
 +
'''Левым языком''' (англ. ''left language'') {{---}} называется язык <tex>L_g(q)</tex>, принимаемый автоматом <tex>\mathcal{A}_{g}(q) = \langle \Sigma , Q , q , T , \delta \rangle</tex>, полученным из <tex>\mathcal{A}</tex> путём добавления уникального терминального состояния <tex>q</tex>.
 +
}}
 +
 +
{{Утверждение
 +
|about=1
 +
|statement=
 +
Автомат является детерминированным тогда и только тогда, когда левые языки его состояний попарно не пересекаются.
 +
}}
 +
 +
{{Определение
 +
|definition=
 +
'''Обратное слово''' <tex>r(u)</tex> для слова <tex>u</tex> определяется следующим образом: <tex>r(\varepsilon) = \varepsilon</tex> и если <tex>u = u_1 u_2 u_3 \dotsc u_p</tex>, тогда <tex>r(u) = v_1 v_2 v_3 \dotsc v_p</tex>, где <tex>v_i = u_{p - i + 1}</tex>.
 +
}}
 +
 +
{{Определение
 +
|definition=
 +
'''Обратный язык''' для языка <tex>L</tex> {{---}} язык <tex>r(L) = \{ u \mid r(u) \in L \}</tex>
 +
}}
 +
 +
{{Определение
 +
|definition=
 +
'''Обратный автомат''' для автомата <tex>\mathcal{A} = \langle \Sigma , Q , S , T , \delta \rangle</tex> {{---}} автомат <tex>r(\mathcal{A}) = \langle \Sigma , Q , T , I , r(\delta) \rangle</tex>, полученный из <tex>\mathcal{A}</tex> сменой местами начальных и конечных состояний и сменой направлений переходов.
 +
}}
 +
 +
{{Утверждение
 +
|about=2
 +
|statement=
 +
Если <tex>\mathcal{A}</tex> распознает язык <tex>L</tex>, то <tex>r(\mathcal{A})</tex> распознает <tex>r(L)</tex>.
 +
}}
 +
 +
{{Утверждение
 +
|about=3
 +
|statement=
 +
Если левый язык состояния <tex>q</tex> в <tex>\mathcal{A}</tex> {{---}} <tex>L_g(q)</tex>, тогда его левый язык в <tex>r(A)</tex> {{---}} <tex>L_d(q)</tex>. Аналогично для правого языка <tex>q</tex>.
 
}}
 
}}
  

Версия 18:08, 16 октября 2016

Задача:
Пусть дан автомат [math]\mathcal{A}[/math]. Требуется построить автомат [math]\mathcal{A}_{min}[/math] с наименьшим количеством состояний, распознающий тот же язык, что и [math]\mathcal{A}[/math].


Описание

Пусть [math]q[/math] — состояние автомата [math]\mathcal{A} = \langle \Sigma , Q, s \in Q, T \subset Q, \delta : Q \times \Sigma \to Q \rangle[/math].

Определение:
Правым языком (англ. right language) — называется язык [math]L_d(q)[/math], принимаемый автоматом [math]\mathcal{A}_{d}(q) = \langle \Sigma , Q , q , T , \delta \rangle[/math], полученным из [math]\mathcal{A}[/math] путём добавления уникального начального состояния [math]q[/math].


Определение:
Левым языком (англ. left language) — называется язык [math]L_g(q)[/math], принимаемый автоматом [math]\mathcal{A}_{g}(q) = \langle \Sigma , Q , q , T , \delta \rangle[/math], полученным из [math]\mathcal{A}[/math] путём добавления уникального терминального состояния [math]q[/math].


Утверждение (1):
Автомат является детерминированным тогда и только тогда, когда левые языки его состояний попарно не пересекаются.


Определение:
Обратное слово [math]r(u)[/math] для слова [math]u[/math] определяется следующим образом: [math]r(\varepsilon) = \varepsilon[/math] и если [math]u = u_1 u_2 u_3 \dotsc u_p[/math], тогда [math]r(u) = v_1 v_2 v_3 \dotsc v_p[/math], где [math]v_i = u_{p - i + 1}[/math].


Определение:
Обратный язык для языка [math]L[/math] — язык [math]r(L) = \{ u \mid r(u) \in L \}[/math]


Определение:
Обратный автомат для автомата [math]\mathcal{A} = \langle \Sigma , Q , S , T , \delta \rangle[/math] — автомат [math]r(\mathcal{A}) = \langle \Sigma , Q , T , I , r(\delta) \rangle[/math], полученный из [math]\mathcal{A}[/math] сменой местами начальных и конечных состояний и сменой направлений переходов.


Утверждение (2):
Если [math]\mathcal{A}[/math] распознает язык [math]L[/math], то [math]r(\mathcal{A})[/math] распознает [math]r(L)[/math].
Утверждение (3):
Если левый язык состояния [math]q[/math] в [math]\mathcal{A}[/math][math]L_g(q)[/math], тогда его левый язык в [math]r(A)[/math][math]L_d(q)[/math]. Аналогично для правого языка [math]q[/math].

Алгоритм

Описание

Алгоритм минимизации конечных автоматов Бржозовского (Janusz A. (John) Brzozowski) выделяется, по крайней мере, следующими качествами:

Обладая обычными процедурами обращения [math]\operatorname{rev}[/math] и детерминизации [math]\operatorname{det}[/math] конечного автомата, мы, с помощью идеи Бржозовского, можем немедленно приступить к минимизации заданного автомата. Для этого надо дважды провести его через обе вышеуказанные процедуры:

[math]mFA = \operatorname {det}(\operatorname{rev}(\operatorname{det}(\operatorname{rev}(FA))))[/math], где

  • [math]FA[/math] это исходный КА,
  • [math]\operatorname{rev}[/math] это процедура обращения КА,
  • [math]\operatorname{det}[/math] это процедура детерминизации КА,
  • [math]mFA[/math] это минимизированный КА.

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

Корректность алгоритма доказана в работе[1]

Пример работы

  1. Исходный НКА ([math]FA[/math]):
    Исходный НКА
  2. Первый шаг алгоритма ([math]\operatorname{rev}(FA)[/math]):
    Первый шаг
  3. Второй шаг алгоритма ([math]\operatorname{det}(\operatorname{rev}(FA))[/math]):
    Второй шаг
    [math]\operatorname{det}[/math] переименовывает состояния, после этого [math]0[/math] всегда является начальным состоянием
  4. Третий шаг алгоритма ([math]\operatorname{rev}(\operatorname{det}(\operatorname{rev}(FA)))[/math]):
    Третий шаг
    После выполнения этого шага алгоритма оба состояния [math]2[/math] и [math]3[/math] являются начальными.
  5. Заключительный шаг алгоритма ([math]\operatorname{det}(\operatorname{rev}(\operatorname{det}(\operatorname{rev}(FA))))[/math]):
    Заключительный шаг

Заключение

Самым эффективным алгоритмом минимизации принято считать алгоритм Хопкрофта, который, как и прочие традиционные алгоритмы, работает только с ДКА. Его асимптотическое время выполнения зависит от логарифма исходных данных. С другой стороны очевидно, что алгоритм Бржозовского в худшем случае будет обладать экспоненциальным временем выполнения, ведь этого требует процедура детерминизации, выполняемая дважды. На практике же наблюдается парадокс, алгоритм Бржозовского во многих случаях опережает прочие подходы к минимизации, включая и алгоритм Хопкрофта. В работе[2], сравнивающей оба алгоритма, показано, что алгоритм Бржозовского оказывается эффективнее алгоритма Хопкрофта для автоматов с большим числом переходов.

См. также

Примечания

Источники информации