Изменения
Нет описания правки
= Постановка задачи =
Пусть дан автомат , распознающий определенный язык. Требуется найти [[ Эквивалентность_состояний_ДКА | эквивалентный автомат]] с наименьшим количеством состояний.
= Минимизация ДКА =
Понятие [[ Эквивалентность_состояний_ДКА | эквивалентности состояний]] позволяет объединить состояния в блоки следующим образом.
# Все состояния в блоке эквивалентны.
# Любые два состояния, выбранные из разных блоков, неэквивалентны.
Таким образом, основная идея минимизации ДКА состоит в разбиении множества состояний на блоки эквивалентности.
===Пример минимизации ДКА===
[[Изображение:Automaton1.png]][[Изображение:Automaton2.png]]
Первый блок состоит из состояния <tex>A</tex>, а второй из эквивалентных состояний <tex>B</tex> и <tex>C</tex>.
= Алгоритм =
===Псевдокод===
<tex>Q</tex> {{---}} множество состояний ДКА.<tex>F</tex> {{---}} множество терминальных состояний.<tex>W</tex> {{---}} множество сплиттеровочередь.<tex>P</tex> {{---}} множество всех блоков разбиение множества состояний ДКА.<tex>R</tex> {{---}} класс состояний ДКА.
<tex>W \leftarrow \{ F, Q \setminus F \}</tex>
<tex>P \leftarrow \{ F, Q \setminus F \}</tex>
while not isEmpty(<tex>W</tex> is not empty do ) select and remove <tex>SW</tex> from .pop(<tex>WS</tex>) for all <tex>a \in \Sigma</tex> do <tex>l_a \leftarrow \delta^{-1} (S, a)</tex> for all <tex>R</tex> in <tex>P : R \cap l_a \ne \emptyset</tex> and <tex>R \not \subseteq l_a </tex> do partition <tex>R</tex> into <tex>R_1</tex> and <tex>R_2 : R_1 \leftarrow R \cap l_a \delta^{-1} (S, a) </tex> and <tex>R_2 \leftarrow R - \setminus R_1</tex> replace <tex>R</tex> in <tex>P</tex> with if <tex>|R_1| \ne 0</tex> and & <tex>|R_2</tex> if <tex>R | \in Wne 0</tex> then replace <tex>R</tex> in <tex>WP</tex> with <tex>R_1</tex> and <tex>R_2</tex> else if <tex> |R_1| \le |R_2|</tex> then add <tex>R_1W</tex> to .push(<tex>WR_1</tex>) else add <tex>R_2W</tex> to .push(<tex>WR_2</tex>)
==Время работы алгоритма==
Благодаря системе добавления множеств классов состояний в множество сплиттеровочередь, каждое ребро будет рассмотрено не более чем <tex>\log{n}</tex> раз. А так как ребер у нас порядка <tex> |\Sigma| * n </tex> то получаем <tex> O(n\log{n})</tex>
= Литература =
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' {{---}} '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 сС. 177: ISBN 5-8459-0261-4 (рус.)
[[Категория: Теория формальных языков]]
* ''J. E. Hopcroft.'' {{---}} '''An n log n algorithm for minimizing states in a finite automaton.''' Technical Report CS-71-190, Stanford University, January 1971.