Изменения

Перейти к: навигация, поиск
Нет описания правки
= Постановка задачи =
Пусть дан автомат , распознающий определенный язык. Требуется найти [[ Эквивалентность_состояний_ДКА | эквивалентный автомат]] с наименьшим количеством состояний.
= Минимизация ДКА =
Понятие [[ Эквивалентность_состояний_ДКА | эквивалентности состояний]] позволяет объединить состояния в блоки следующим образом.
# Все состояния в блоке эквивалентны.
# Любые два состояния, выбранные из разных блоков, неэквивалентны.
Таким образом, основная идея минимизации ДКА состоит в разбиении множества состояний на блоки эквивалентности.
===Пример минимизации ДКА===
[[Изображение:Automaton1.png]][[Изображение:Automaton2.png]]
 
Первый блок состоит из состояния <tex>A</tex>, а второй из эквивалентных состояний <tex>B</tex> и <tex>C</tex>.
= Алгоритм =
Основная идея минимизации состоит в разделении Алгоритм итеративно строит разбиение множества состояний ДКА на классы эквивалентности. Получившиеся классы и будут состояниями минимального автоматаследующим образом===Разбиения на блоки===Пусть <tex>Q</tex> # Первоначальное разбиение множества состояний {{---}} множество класс допускающих состояний и класс недопускающих состояний ДКА. Разделим <tex>Q</tex> на 2 # Алгоритм помещает оба эти класса в очередь.# Из очереди извлекается класс, далее именуемый как сплиттер.# Перебираются все символы из алфавита <tex>F</tex> и <tex>Q \setminus FSigma</tex>, где <tex>Fc</tex> {{---}} множество терминальных состояний и <tex>Q \setminus F</tex> {{---}} множество нетерминальных состоянийтекущий символ. Теперь будем делить # Все классы до тех пор, пока они не будут содержать только эквивалентные состояния. Для этого создадим множество сплиттеров, где сплиттер {{---}} это множество состояний. Для каждой буквы <tex>a</tex> текущего разбиения разбиваются на 2 подкласса (один из алфавита <tex>\Sigma</tex> создадим множество <tex>l_a</tex>, состоящее из состояний имеющих ребро в текущий сплиттер по букве <tex>a</tex>. Если какой-нибудь класс имеет не нулевое пересечение с <tex>l_a</tex>, а также не является его подмножеством, то его можно разделить на два новых классакоторых может быть пустым). Первый класс состоит из состояний, которые имеют ребра в текущий сплиттер по букве символу <tex>ac</tex>переходят в сплиттер, а второй класс состоит из всех оставшихся состояний. Меньший # Те классы, которые разбились на два непустых подкласса, заменяются этими подклассами в разбиении, а также меньший из них добавим двух подклассов добавляется в множество сплиттеров <tex>W</tex> и обновим множество блоков <tex>P</tex>очередь. Продолжаем деление до тех пор пока множество сплиттеров # Пока очередь не пустопуста, алгоритм выполняет п.3 – п.6.
===Псевдокод===
<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.
Анонимный участник

Навигация