Минимизация ДКА, алгоритм Хопкрофта (сложность O(n log n)) — различия между версиями
(→Постановка задачи) |
|||
Строка 1: | Строка 1: | ||
= Постановка задачи = | = Постановка задачи = | ||
− | Пусть дан автомат распознающий определенный язык. Требуется найти [[ Эквивалентность_состояний_ДКА | эквивалентный автомат]] с наименьшим количеством состояний. | + | Пусть дан автомат, распознающий определенный язык. Требуется найти [[ Эквивалентность_состояний_ДКА | эквивалентный автомат]] с наименьшим количеством состояний. |
+ | = Минимизация ДКА = | ||
+ | Понятие [[ Эквивалентность_состояний_ДКА | эквивалентности состояний]] позволяет объединить состояния в блоки следующим образом. | ||
+ | # Все состояния в блоке эквивалентны. | ||
+ | # Любые два состояния, выбранные из разных блоков, неэквивалентны. | ||
+ | Таким образом, основная идея минимизации ДКА состоит в разбиении множества состояний на блоки эквивалентности. | ||
+ | ===Пример минимизации ДКА=== | ||
+ | [[Изображение:Automaton1.png]][[Изображение:Automaton2.png]] | ||
+ | |||
+ | Первый блок состоит из состояния <tex>A</tex>, а второй из эквивалентных состояний <tex>B</tex> и <tex>C</tex>. | ||
= Алгоритм = | = Алгоритм = | ||
− | + | Алгоритм итеративно строит разбиение множества состояний следующим образом. | |
− | + | # Первоначальное разбиение множества состояний {{---}} класс допускающих состояний и класс недопускающих состояний. | |
− | + | # Алгоритм помещает оба эти класса в очередь. | |
− | + | # Из очереди извлекается класс, далее именуемый как сплиттер. | |
+ | # Перебираются все символы из алфавита <tex>\Sigma</tex>, где <tex>c</tex> {{---}} текущий символ. | ||
+ | # Все классы текущего разбиения разбиваются на 2 подкласса (один из которых может быть пустым). Первый состоит из состояний, которые по символу <tex>c</tex> переходят в сплиттер, а второй из всех оставшихся. | ||
+ | # Те классы, которые разбились на два непустых подкласса, заменяются этими подклассами в разбиении, а также меньший из двух подклассов добавляется в очередь. | ||
+ | # Пока очередь не пуста, алгоритм выполняет п.3 – п.6. | ||
===Псевдокод=== | ===Псевдокод=== | ||
− | <tex>W</tex> {{---}} | + | <tex>Q</tex> {{---}} множество состояний ДКА. |
− | <tex>P</tex> {{---}} | + | <tex>F</tex> {{---}} множество терминальных состояний. |
+ | <tex>W</tex> {{---}} очередь. | ||
+ | <tex>P</tex> {{---}} разбиение множества состояний ДКА. | ||
+ | <tex>R</tex> {{---}} класс состояний ДКА. | ||
<tex>W \leftarrow \{ F, Q \setminus F \}</tex> | <tex>W \leftarrow \{ F, Q \setminus F \}</tex> | ||
<tex>P \leftarrow \{ F, Q \setminus F \}</tex> | <tex>P \leftarrow \{ F, Q \setminus F \}</tex> | ||
− | while <tex>W</tex> | + | while not isEmpty(<tex>W</tex>) |
− | + | <tex>W</tex>.pop(<tex>S</tex>) | |
− | for all <tex>a \in \Sigma | + | for all <tex>a \in \Sigma</tex> |
− | + | for all <tex>R</tex> in <tex>P</tex> | |
− | for all <tex>R</tex> in <tex>P | + | <tex>R_1 \leftarrow R \cap \delta^{-1} (S, a) </tex> |
− | + | <tex>R_2 \leftarrow R \setminus R_1</tex> | |
− | + | if <tex> |R_1| \ne 0</tex> & <tex>|R_2| \ne 0</tex> | |
− | + | replace <tex>R</tex> in <tex>P</tex> with <tex>R_1</tex> and <tex>R_2</tex> | |
− | replace <tex>R</tex> in <tex> | + | if <tex> |R_1| \le |R_2|</tex> then |
− | + | <tex>W</tex>.push(<tex>R_1</tex>) | |
− | + | else | |
− | + | <tex>W</tex>.push(<tex>R_2</tex>) | |
− | + | ||
− | |||
− | |||
==Время работы алгоритма== | ==Время работы алгоритма== | ||
− | Благодаря системе добавления | + | Благодаря системе добавления классов состояний в очередь, каждое ребро будет рассмотрено не более чем <tex>\log{n}</tex> раз. А так как ребер у нас порядка <tex> |\Sigma| * n </tex> то получаем <tex> O(n\log{n})</tex> |
= Литература = | = Литература = | ||
− | * ''Хопкрофт Д., Мотвани Р., Ульман Д.'' | + | * ''Хопкрофт Д., Мотвани Р., Ульман Д.'' '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — С. 177: ISBN 5-8459-0261-4 (рус.) |
[[Категория: Теория формальных языков]] | [[Категория: Теория формальных языков]] | ||
− | * ''J. E. Hopcroft.'' | + | * ''J. E. Hopcroft.'' '''An n log n algorithm for minimizing states in a finite automaton.''' Technical Report CS-71-190, Stanford University, January 1971. |
Версия 04:29, 11 ноября 2011
Содержание
Постановка задачи
Пусть дан автомат, распознающий определенный язык. Требуется найти эквивалентный автомат с наименьшим количеством состояний.
Минимизация ДКА
Понятие эквивалентности состояний позволяет объединить состояния в блоки следующим образом.
- Все состояния в блоке эквивалентны.
- Любые два состояния, выбранные из разных блоков, неэквивалентны.
Таким образом, основная идея минимизации ДКА состоит в разбиении множества состояний на блоки эквивалентности.
Пример минимизации ДКА
Первый блок состоит из состояния
, а второй из эквивалентных состояний и .Алгоритм
Алгоритм итеративно строит разбиение множества состояний следующим образом.
- Первоначальное разбиение множества состояний — класс допускающих состояний и класс недопускающих состояний.
- Алгоритм помещает оба эти класса в очередь.
- Из очереди извлекается класс, далее именуемый как сплиттер.
- Перебираются все символы из алфавита , где — текущий символ.
- Все классы текущего разбиения разбиваются на 2 подкласса (один из которых может быть пустым). Первый состоит из состояний, которые по символу переходят в сплиттер, а второй из всех оставшихся.
- Те классы, которые разбились на два непустых подкласса, заменяются этими подклассами в разбиении, а также меньший из двух подклассов добавляется в очередь.
- Пока очередь не пуста, алгоритм выполняет п.3 – п.6.
Псевдокод
— множество состояний ДКА. — множество терминальных состояний. — очередь. — разбиение множества состояний ДКА. — класс состояний ДКА.
while not isEmpty( ) .pop( ) for all for all in if & replace in with and if then .push( ) else .push( )
Время работы алгоритма
Благодаря системе добавления классов состояний в очередь, каждое ребро будет рассмотрено не более чем
раз. А так как ребер у нас порядка то получаемЛитература
- Хопкрофт Д., Мотвани Р., Ульман Д. Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — С. 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.