Минимизация ДКА, алгоритм Хопкрофта (сложность O(n log n)) — различия между версиями
(→Простой алгоритм) |
Glukos (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
− | |||
Пусть дан автомат, распознающий определенный язык. Требуется найти [[ Эквивалентность_состояний_ДКА | эквивалентный автомат]] с наименьшим количеством состояний. | Пусть дан автомат, распознающий определенный язык. Требуется найти [[ Эквивалентность_состояний_ДКА | эквивалентный автомат]] с наименьшим количеством состояний. | ||
− | = Минимизация ДКА = | + | == Минимизация ДКА == |
Если в ДКА существуют два [[ Эквивалентность_состояний_ДКА | эквивалентных состояния]], то при их объединении мы получим [[ Эквивалентность_состояний_ДКА | эквивалентный ДКА]], так как распознаваемый язык не изменится. Основная идея минимизации состоит в разбиении множества состояний на классы эквивалентности, полученные классы и будут состояниями минимизированного ДКА. | Если в ДКА существуют два [[ Эквивалентность_состояний_ДКА | эквивалентных состояния]], то при их объединении мы получим [[ Эквивалентность_состояний_ДКА | эквивалентный ДКА]], так как распознаваемый язык не изменится. Основная идея минимизации состоит в разбиении множества состояний на классы эквивалентности, полученные классы и будут состояниями минимизированного ДКА. | ||
− | = Простой алгоритм = | + | == Простой алгоритм == |
{{Определение | {{Определение | ||
|definition = | |definition = | ||
Строка 16: | Строка 15: | ||
Итеративно строим разбиение множества состояний следующим образом. | Итеративно строим разбиение множества состояний следующим образом. | ||
− | # Первоначальное разбиение множества состояний {{---}} класс допускающих состояний и класс недопускающих состояний. | + | # Первоначальное разбиение множества состояний {{---}} класс допускающих состояний <tex>Q</tex> и класс недопускающих состояний <tex>Q \setminus F</tex>. |
− | # | + | # Перебираются символы алфавита <tex>a \in \Sigma</tex>, все пары <tex>(Q, a)</tex> и <tex>(Q \setminus F, a)</tex> помещаются в очередь. |
− | # Из очереди извлекается | + | # Из очереди извлекается пара <tex>(S, a)</tex>, <tex>S</tex> далее именуется как сплиттер. |
− | |||
# Все классы текущего разбиения разбиваются на 2 подкласса (один из которых может быть пустым). Первый состоит из состояний, которые по символу <tex>a</tex> переходят в сплиттер, а второй из всех оставшихся. | # Все классы текущего разбиения разбиваются на 2 подкласса (один из которых может быть пустым). Первый состоит из состояний, которые по символу <tex>a</tex> переходят в сплиттер, а второй из всех оставшихся. | ||
# Те классы, которые разбились на два непустых подкласса, заменяются этими подклассами в разбиении, а также добавляются в очередь. | # Те классы, которые разбились на два непустых подкласса, заменяются этими подклассами в разбиении, а также добавляются в очередь. | ||
− | # Пока очередь не пуста, выполняем п.3 – п. | + | # Пока очередь не пуста, выполняем п.3 – п.5. |
===Псевдокод=== | ===Псевдокод=== | ||
Строка 44: | Строка 42: | ||
Когда очередь станет пустой будет получено разбиение на классы эквивалентности, так как больше ни один класс невозможно разбить. | Когда очередь станет пустой будет получено разбиение на классы эквивалентности, так как больше ни один класс невозможно разбить. | ||
− | = Алгоритм Хопкрофта= | + | == Алгоритм Хопкрофта== |
{{Лемма | {{Лемма | ||
Строка 98: | Строка 96: | ||
else | else | ||
<tex>W</tex>.push(<tex>R_2</tex>) | <tex>W</tex>.push(<tex>R_2</tex>) | ||
− | =Время работы алгоритма= | + | ==Время работы алгоритма== |
Время работы алгоритма равно <tex>O(|\Sigma| * n\log{n})</tex>, где <tex> n </tex> {{---}} количество состояний ДКА, а <tex> \Sigma </tex>{{---}} алфавит. Это следует из того, что каждое из ребер, а их порядка <tex> |\Sigma| * n </tex>, участвует не более чем в <tex> \log{n}</tex> разбиениях. | Время работы алгоритма равно <tex>O(|\Sigma| * n\log{n})</tex>, где <tex> n </tex> {{---}} количество состояний ДКА, а <tex> \Sigma </tex>{{---}} алфавит. Это следует из того, что каждое из ребер, а их порядка <tex> |\Sigma| * n </tex>, участвует не более чем в <tex> \log{n}</tex> разбиениях. | ||
− | = Литература = | + | == Литература == |
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — М.: Издательский дом «Вильямс», 2002. — С. 177 — ISBN 5-8459-0261-4 (рус.) | * ''Хопкрофт Д., Мотвани Р., Ульман Д.'' Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — М.: Издательский дом «Вильямс», 2002. — С. 177 — ISBN 5-8459-0261-4 (рус.) | ||
* ''D. Gries.'' Describing an algorithm by Hopcroft. Technical Report TR-72-151, Cornell University, December 1972. | * ''D. Gries.'' Describing an algorithm by Hopcroft. Technical Report TR-72-151, Cornell University, December 1972. |
Версия 17:45, 15 января 2013
Пусть дан автомат, распознающий определенный язык. Требуется найти эквивалентный автомат с наименьшим количеством состояний.
Содержание
Минимизация ДКА
Если в ДКА существуют два эквивалентных состояния, то при их объединении мы получим эквивалентный ДКА, так как распознаваемый язык не изменится. Основная идея минимизации состоит в разбиении множества состояний на классы эквивалентности, полученные классы и будут состояниями минимизированного ДКА.
Простой алгоритм
Определение: |
Класс | разбивает класс по символу на и , если
Если класс
может быть разбит по символу , то он содержит хотя бы одну пару неэквивалентных состояний (так как существует строка которая их различает). Если класс нельзя разбить, то он состоит из эквивалентных состояний. Поэтому самый простой алгоритм состоит в том, чтобы разбивать классы текущего разбиения до тех пор пока это возможно.Итеративно строим разбиение множества состояний следующим образом.
- Первоначальное разбиение множества состояний — класс допускающих состояний и класс недопускающих состояний .
- Перебираются символы алфавита , все пары и помещаются в очередь.
- Из очереди извлекается пара , далее именуется как сплиттер.
- Все классы текущего разбиения разбиваются на 2 подкласса (один из которых может быть пустым). Первый состоит из состояний, которые по символу переходят в сплиттер, а второй из всех оставшихся.
- Те классы, которые разбились на два непустых подкласса, заменяются этими подклассами в разбиении, а также добавляются в очередь.
- Пока очередь не пуста, выполняем п.3 – п.5.
Псевдокод
— множество состояний ДКА. — множество терминальных состояний. — очередь. — разбиение множества состояний ДКА. — класс состояний ДКА.
while not .isEmpty() .pop( ) for all for all in if and replace in with and .push( ) .push( )
Когда очередь станет пустой будет получено разбиение на классы эквивалентности, так как больше ни один класс невозможно разбить.
Алгоритм Хопкрофта
Лемма: |
Класс и , тогда разбиение всех классов (текущее разбиение) по символу любыми двумя классами из эквивалентно разбиению всех классов с помощью по символу . |
Доказательство: |
Разобьем все классы с помощью и по символу , тогда для любого класса из текущего разбиения выполняется
А так как и то выполняется
Из этого следует, что разбиение всех классов с помощью
А так как и то выполняется
|
Алгоритм Хопкрофта отличается от простого тем, что иначе добавляет классы в очередь. Если класс
уже есть в очереди, то согласно лемме можно просто заменить его на и . Если класса нет в очереди, то согласно лемме в очередь можно добавить класс и любой из и , а так как для любого класса из текущего разбиения выполняется- or
то в очередь можно добавить только меньшее из
и .Псевдокод
— множество состояний ДКА. — множество терминальных состояний. — очередь. — разбиение множества состояний ДКА. — класс состояний ДКА.
if.push( ) else .push( ) while not .isEmpty() .pop( ) for all for each in split by replace in with and if in replace in with and else if .push( ) else .push( )
Время работы алгоритма
Время работы алгоритма равно
, где — количество состояний ДКА, а — алфавит. Это следует из того, что каждое из ребер, а их порядка , участвует не более чем в разбиениях.Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — М.: Издательский дом «Вильямс», 2002. — С. 177 — ISBN 5-8459-0261-4 (рус.)
- D. Gries. Describing an algorithm by Hopcroft. Technical Report TR-72-151, Cornell University, December 1972.