Минимизация ДКА, алгоритм Хопкрофта (сложность O(n log n)) — различия между версиями
Строка 2: | Строка 2: | ||
Пусть дан автомат, распознающий определенный язык. Требуется найти [[ Эквивалентность_состояний_ДКА | эквивалентный автомат]] с наименьшим количеством состояний. | Пусть дан автомат, распознающий определенный язык. Требуется найти [[ Эквивалентность_состояний_ДКА | эквивалентный автомат]] с наименьшим количеством состояний. | ||
− | = | + | = Алгоритм Хопкрофта= |
− | + | Если в ДКА существуют два [[ Эквивалентность_состояний_ДКА | эквивалентных состояния]], то при их объединении мы получим [[ Эквивалентность_состояний_ДКА | эквивалентный ДКА]], так как распознаваемый язык не изменится. Основная идея алгоритма состоит в разбиении множества состояний на классы эквивалентности, полученные классы и будут состояниями минимизированного ДКА. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Итеративно строим разбиение множества состояний следующим образом. | Итеративно строим разбиение множества состояний следующим образом. | ||
# Первоначальное разбиение множества состояний {{---}} класс допускающих состояний и класс недопускающих состояний. | # Первоначальное разбиение множества состояний {{---}} класс допускающих состояний и класс недопускающих состояний. | ||
Строка 47: | Строка 40: | ||
else | else | ||
<tex>W</tex>.push(<tex>R_2</tex>) | <tex>W</tex>.push(<tex>R_2</tex>) | ||
+ | =Корректность алгоритма= | ||
− | + | ||
+ | =Время работы алгоритма= | ||
Благодаря системе добавления классов состояний в очередь, каждое ребро будет рассмотрено не более чем <tex>\log{n}</tex> раз. А так как ребер у нас порядка <tex> |\Sigma| * n </tex> то получаем <tex> O(n\log{n})</tex> | Благодаря системе добавления классов состояний в очередь, каждое ребро будет рассмотрено не более чем <tex>\log{n}</tex> раз. А так как ребер у нас порядка <tex> |\Sigma| * n </tex> то получаем <tex> O(n\log{n})</tex> | ||
= Литература = | = Литература = |
Версия 01:02, 14 февраля 2012
Содержание
Постановка задачи
Пусть дан автомат, распознающий определенный язык. Требуется найти эквивалентный автомат с наименьшим количеством состояний.
Алгоритм Хопкрофта
Если в ДКА существуют два эквивалентных состояния, то при их объединении мы получим эквивалентный ДКА, так как распознаваемый язык не изменится. Основная идея алгоритма состоит в разбиении множества состояний на классы эквивалентности, полученные классы и будут состояниями минимизированного ДКА.
Итеративно строим разбиение множества состояний следующим образом.
- Первоначальное разбиение множества состояний — класс допускающих состояний и класс недопускающих состояний.
- Меньший из них помещается в очередь.
- Из очереди извлекается класс, далее именуемый как сплиттер.
- Перебираются все символы из алфавита , где — текущий символ.
- Все классы текущего разбиения разбиваются на 2 подкласса (один из которых может быть пустым). Первый состоит из состояний, которые по символу переходят в сплиттер, а второй из всех оставшихся.
- Те классы, которые разбились на два непустых подкласса, заменяются этими подклассами в разбиении, а также меньший из двух подклассов добавляется в очередь.
- Пока очередь не пуста, алгоритм выполняет п.3 – п.6.
Псевдокод
— множество состояний ДКА. — множество терминальных состояний. — очередь. — разбиение множества состояний ДКА. — класс состояний ДКА.
if.push( ) else .push( ) while not .isEmpty() .pop( ) for all for all in if and replace in with and if in replace in with and else if .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.