Изменения

Перейти к: навигация, поиск
м
rollbackEdits.php mass rollback
==Определения=={{ОпределениеЗадача
|definition =
Состояния <tex>u</tex> и <tex>v</tex> различимы строкой <tex>s</tex> если# Пусть дан [[Детерминированные_конечные_автоматы | автомат]] <tex> \langle u, s \rangle \vdash^* \langle t, \varepsilon \rangle mathcal{A}</tex>, где . Требуется построить автомат <tex>t \in T mathcal{A}_{min}</tex># <tex> \langle vс наименьшим количеством состояний, s \rangle \vdash^* \langle zраспознающий тот же язык, \varepsilon \rangle </tex>, где что и <tex>z \notin T </tex>mathcal{A}}{{Определение|definition = Состояния <tex>u</tex> и <tex>v</tex> эквивалентны, если они неразличимы никакой строкой <tex>s</tex>.
}}
==Алгоритм==
=== Описание ===
Основная идея алгоритма заключается в том, чтобы разбить состояния на [[Отношение эквивалентности#Классы эквивалентности | классы эквивалентности]] — они и будут состояниями минимизированного автомата.
 
Для реализации алгоритма нам потребуются [[Очередь | очередь]] <tex>Q</tex> и таблица <tex>marked</tex> размером <tex>n \times n</tex>, где <tex>n</tex> — количество состояний автомата. Будем помечать в таблице пары [[Эквивалентность состояний ДКА | неэквивалентных состояний]] и класть их в очередь.
 
* В исходном автомате мы имели <tex>n</tex> состояний с номерами от <tex>0</tex> до <tex>n - 1</tex>. Удобно будет увеличить все номера состояний на <tex>1</tex> и добавить в исходный автомат вершину <tex>0</tex>, в которую будут вести по умолчанию все переходы по всем символам (в том числе переходы по всем символам в эту вершину из неё самой), которых не было в исходном автомате, тем самым увеличив количество состояний <tex>n</tex> на <tex>1</tex>. Теперь стартовое состояние будет иметь номер <tex>1</tex>.
* '''Шаг 1'''. Построим множество <tex>\delta^{-1}</tex>, в котором будем хранить списки обратных ребер.
* '''Шаг 2'''. Найдем все достижимые состояния из стартового. Например, с помощью [[Обход_в_глубину,_цвета_вершин | обхода в глубину]].
* '''Шаг 3'''. Добавим в очередь <tex>Q</tex> пары состояний, различимых строкой <tex> \varepsilon </tex>, и пометим их в таблице.
* '''Шаг 4'''. Для каждой непомеченной пары <tex> \langle u, v \rangle </tex> нужно проверить, что <tex>\exists c \in \Sigma</tex> такой, что пара <tex>\langle \delta(u, c), \delta(v, c) \rangle</tex> помечена. Тогда мы можем пометить пару <tex> \langle u, v \rangle </tex>.
: Пока <tex>Q</tex> не станет пуста, будем делать следующее:
: 1. Извлечем пару <tex> \langle u, v \rangle </tex> из <tex>Q</tex>.
: 2. Для каждого символа <tex>c \in \Sigma</tex> перебираем пары состояний <tex>\langle \delta^{-1}(u, c), \delta^{-1}(v,c) \rangle</tex>. Если находим ещё непомеченную пару, то помечаем её в таблице и кладем в очередь.
: В момент опустошения очереди пары состояний, не помеченные в таблице, являются парами эквивалентных состояний.
* '''Шаг 5'''. За один проход по таблице разбиваем пары эквивалентных состояний на классы эквивалентности.
* '''Шаг 6'''. За один проход по списку классов эквивалентности выделяем список новых состояний и переходов между ними.
Стартовым состоянием полученного автомата будет состояние, соответствующее классу эквивалентности, содержащему стартовое состояние исходного автомата.
 
Терминальными состояниями полученного автомата будут состояния, соответствующие классам эквивалентности, содержащим терминальные состояния исходного автомата.
 
===Корректность===
Пусть в результате применения данного алгоритма к автомату <tex>A</tex> мы получили автомат <tex>\mathcal{A}_{min}</tex>. Докажем, что этот автомат минимальный и единственный с точностью до изоморфизма.
 
Пусть существует автомат <tex>\mathcal{A}'</tex>, эквивалентный <tex>\mathcal{A}</tex>, но с числом состояний меньшим, чем в <tex>\mathcal{A}_{min}</tex>.
Стартовые состояния <tex>s \in \mathcal{A}_{min}</tex> и <tex>s' \in \mathcal{A}'</tex> эквивалентны, так как <tex>\mathcal{A}_{min}</tex> и <tex>\mathcal{A}'</tex> допускают один и тот же язык. Рассмотрим строку <tex>\alpha = a_1a_2 \ldots a_{k}</tex>, где <tex>a_{i} \in \Sigma</tex>, такую, что <tex> \langle s, \alpha \rangle \vdash^* \langle u, \varepsilon \rangle </tex>, <tex> \langle s', \alpha \rangle \vdash^* \langle u', \varepsilon \rangle </tex>. Пусть <tex>\langle s, a_1 \rangle \vdash \langle l, \varepsilon \rangle </tex> и <tex>\langle s', a_1 \rangle \vdash \langle l', \varepsilon \rangle </tex>. Так как <tex>s</tex> и <tex>s'</tex> эквивалентны, то <tex>l</tex> и <tex>l'</tex> эквивалентны. Аналогично для всех <tex>a_{i}</tex>. В итоге получим, что <tex>u</tex> эквивалентно <tex>u'</tex>. Значит, для каждого состояния из <tex>\mathcal{A}_{min}</tex> существует эквивалентное состояние из <tex>\mathcal{A}'</tex>.
 
Состояний в <tex>A'</tex> меньше, чем в <tex>\mathcal{A}_{min}</tex>, значит двум состояниям из <tex>\mathcal{A}_{min}</tex> эквивалентно одно состояние из <tex>\mathcal{A}'</tex>. Тогда эти два состояния эквивалентны, но автомат <tex>\mathcal{A}_{min}</tex> построен так, что в нем нет эквивалентных состояний. Противоречие.
 
Так как каждому состоянию из <tex>\mathcal{A}_{min}</tex> эквивалентно состояние из <tex>\mathcal{A}'</tex>, то автоматы <tex>\mathcal{A}_{min}</tex> и <tex>\mathcal{A}'</tex> изоморфны.
 
== Псевдокод ==
Функция для построения таблицы неэквивалентности.
'''boolean'''[][] buildTable('''int''' n, '''boolean'''[] isTerminal, '''vector'''[][] <tex>\delta^{-1}</tex>):
'''queue''' Q
'''boolean''' marked[n][n]
<font color="green">// Шаг 3</font>
'''for''' i = 0<tex>\ldots</tex>n - 1
'''for''' j = 0<tex>\ldots</tex>n - 1
'''if''' '''not''' marked[i][j] '''and''' isTerminal[i] != isTerminal[j]
marked[i][j] = marked[j][i] = ''true''
Q.push(<tex>\langle i, j \rangle</tex>)
<font color="green">// Шаг 4</font>
'''while''' '''not''' Q.isEmpty()
<tex>\langle u, v \rangle</tex> = Q.poll()
'''for''' c <tex>\in</tex> <tex>\Sigma</tex>
'''for''' r <tex>\in</tex> <tex>\delta^{-1}</tex>[u][c]
'''for''' s <tex>\in</tex> <tex>\delta^{-1}</tex>[v][c]
'''if''' '''not''' marked[r][s]
marked[r][s] = marked[s][r] = ''true''
Q.push(<tex>\langle r, s \rangle</tex>)
'''return''' marked
 
Основная функция алгоритма.
'''function''' minimization('''int''' n, '''boolean'''[] isTerminal, '''int'''[][] <tex>\delta</tex>):
<font color="green">// Шаг 1</font>
Построим таблицу списков обратных ребер {{---}} <tex>\delta^{-1}</tex> размером <tex>n \times |\Sigma|</tex>.
<font color="green">// Шаг 2</font>
Построим массив достижимости состояний из стартового {{---}} reachable размером <tex>n</tex>.
<font color="green">// Шаги 3 и 4</font>
'''boolean'''[][] marked = buildTable(n, isTerminal, <tex>\delta^{-1}</tex>)
<font color="green">// Шаг 5</font>
'''int'''[] component[n] <font color="green">// По позиции i будем хранить номер компоненты эквивалентности для i-ого состояния.</font>
fill(component, -1)
'''for''' i = 0<tex>\ldots</tex>n - 1
'''if''' '''not''' marked[0][i]
component[i] = 0
'''int''' componentsCount = 0
'''for''' i = 1<tex>\ldots</tex>n - 1
'''if''' '''not''' reachable[i]
''continue''
'''if''' component[i] == -1
componentsCount++
component[i] = componentsCount
'''for''' j = i + 1<tex>\ldots</tex>n - 1
'''if''' '''not''' marked[i][j]
component[j] = componentsCount
<font color="green">// Шаг 6</font>
buildDFA(component) <font color="green">// Строим требуемый автомат.</font>
 
==Асимптотика==
Поиск недостижимых состояний с помощью [[Обход_в_глубину,_цвета_вершин | обхода в глубину]] требует <tex>\mathcal{O}(n \cdot |\Sigma|)</tex> времени. Каждую пару мы добавляли в очередь один раз, значит время заполнения таблицы <tex>\mathcal{O}(n^2)</tex>. Разбиение на классы эквивалентности делается за один проход по таблице, то есть за <tex>\mathcal{O}(n^2)</tex>.
 
==Пример работы==
Минимизируем данный автомат:
 
[[Файл:dka.png]]
 
=== Шаг <tex>1</tex> ===
Строим <tex>\delta^{-1}</tex>. Например, <tex>\delta^{-1}(F, 1) = \{C, D, G, F\}</tex>.
 
=== Шаг <tex> 2 </tex> ===
Построили массив достижимости состояний из стартового.
{| border="1" class="wikitable" width="20%" style="color: blue; background-color:#ffffcc;" cellpadding="10"; float: left;"
 
!'''Ø'''
! A
! B
! C
! D
! E
! F
! G
! H
|-
|align="center"|<tex>1</tex>
|align="center"|<tex>1</tex>
|align="center"|<tex>1</tex>
|align="center"|<tex>1</tex>
|align="center"|<tex>0</tex>
|align="center"|<tex>1</tex>
|align="center"|<tex>1</tex>
|align="center"|<tex>1</tex>
|align="center"|<tex>1</tex>
|}
{{Теорема|statement =Если == Шаг <tex>u3 </tex> и <tex>v</tex>, <tex>v</tex> и <tex>z</tex> эквивалентны, то <tex>u</tex> и <tex>z</tex> эквивалентны===Инициализировали таблицу.{|proof border= "1" class="wikitable" width="20%" style="color: blue; background-color:#ffffcc;" cellpadding="10"; float: left;" !!'''Ø'''! A! B! C! D! E! F! G! H|-Пусть !'''Ø'''|||||||align="center"| <texfont color="black">u|align="center"| </texfont color="black"> и ||-! A|||||||align="center"| <texfont color="black">z|align="center"| </texfont color="black"> неэквивалентны. Тогда ||-! B|||||||align="center"| <texfont color="black"> \mathcal {9} s|align="center"| </texfont color="black">, такой, что||-! C||||||# |align="center"| <texfont color="black"> \langle u, s \rangle \vdash^* \langle t, \varepsilon \rangle |align="center"| </texfont color="black">, где ||-! D|||||||align="center"| <texfont color="black">t \in T |align="center"| </texfont color="black"># ||-! E|||||||align="center"| <texfont color="black"> \langle z, s \rangle \vdash^* \langle t_1, \varepsilon \rangle |align="center"| </texfont color="black">, где ||-! F|align="center"| <texfont color="black">t_1 \notin T |align="center"| </texfont color="black">.Рассмотрим |align="center"| <texfont color="black">x|align="center"| </texfont color="black">, такой, что |align="center"| <texfont color="black"> \langle v, s \rangle \vdash^* \langle x, \varepsilon \rangle |align="center"| </texfont color="black">. |||align="center"| <brfont color="black">Если |-! G|align="center"| <texfont color="black">x \in T|align="center"| </texfont color="black">, то |align="center"| <texfont color="black">v|align="center"| </texfont color="black"> и |align="center"| <texfont color="black">z|align="center"| </texfont color="black"> различимы строкой |||align="center"| <texfont color="black">s|-! H|||||||align="center"| </tex>. Противоречие. <brfont color="black">Если |align="center"| <tex>x \notin T</tex>, то <tex>u</tex> и <tex>v</tex> различимы строкой <tex>s</tex>. Противоречие. <brfont color="black">Значит, <tex>u</tex> и <tex>z</tex> эквивалентны.|}|}
Вычислили таблицу.{| border="1" class="wikitable" width="20%" style="color: blue; background-color:#ffffcc;" cellpadding="10"; float: left;" ! !'''Ø'''! A! B! C! D! E! F! G! H|-!'''Ø'''||align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |-! A|align="center"| <font color="black">● |||align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |-! B|align="center"| <font color="black">● |||align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |-! C|align=Алгоритм"center"| <font color="black">● |align="center"| <font color="black">● Основная идея алгоритма разбить состояния на классы эквивалентности — они и будут состояниями минимального автомата.|align="center"| <font color="black">● |||align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |-! D|align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |||align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |-! E|align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● ||align="center"| <font color="black">● |align="center"| <font color="black">● |align="center"| <font color="black">● |-! FВ таблице размером |align="center"| <texfont color="black">n \times n|align="center"| </texfont color="black">, где |align="center"| <texfont color="black">n|align="center"| </texfont color="black"> — количество состояний автомата будем помечать неэквивалентные состояния.Изначально добавим в очередь |align="center"| <texfont color="black">Q|align="center"| </texfont color="black"> пары состояний различимых строкой |||align="center"| <texfont color="black"> \varepsilon |-! G|align="center"| </texfont color="black"> и пометим их в таблице.Пока |align="center"| <texfont color="black">Q|align="center"| </texfont color="black"> не станет пуста, будем делать следующее:#Извлечем пару |align="center"| <texfont color="black"> \langle u, v \rangle |align="center"| </texfont color="black"> из |align="center"| <texfont color="black">Q|||align="center"| </texfont color="black">.|-! H#Для всех пар |align="center"| <texfont color="black"> \langle t, k \rangle |align="center"| </texfont color="black">, таких, что |align="center"| <texfont color="black"> \mathcal {9} c \in \Sigma, \langle t, c \rangle \vdash \langle u, \varepsilon \rangle, \langle k, c \rangle \vdash \langle v, \varepsilon \rangle |align="center"| </texfont color="black"> и пара |align="center"| <texfont color="black"> \langle t, k \rangle|align="center"| </texfont color="black"> не отмечена в таблице, то отметим ее в таблице и добавим в |align="center"| <texfont color="black">Q|align="center"| </texfont color="black">.|За один проход по таблице согласно теореме разбиваем не помеченные состояния на классы эквивалентности.|}
==Корректность алгоритма==Пусть в результате применения данного алгоритма к автомату Шаг <tex>A5 </tex> мы получили автомат <tex>A_{min}</tex>. Докажем===Из таблицы видно, что этот автомат минимальный и единственный с точностью до изоморфизма. <br>Пусть существует автомат <tex>A'</tex> эквивалентный <tex>A</tex>, но с числом классы эквивалентных состояний меньшим чем в <tex>A_{min}</tex>.Стартовые состояния это <tex>s \in A_{min}</tex> и <tex>s' \in A'</tex> эквивалентны, так как <tex>A_{min}</tex> и <tex>A'</tex> допускают один и тот же язык. Рассмотрим строку <tex>B\alpha = a_1a_2...a_{k}</tex>, где <tex>a_\{i} \in \Sigma</tex>C, такую что <tex> D\langle s}, \alpha \rangle \vdash^* \langle u{F, G\varepsilon \rangle </tex>}, <tex> \langle s', {E\alpha \rangle \vdash^* \langle u'}, \varepsilon \rangle </tex>. Пусть <tex>\langle s, a_1 \rangle {H\vdash^* \langle l, \varepsilon \rangle </tex> и <tex>\langle s', a_1 \rangle \vdash^* \langle l', \varepsilon \rangle </tex>. Так как <tex>s</tex> и <tex>s'</tex> эквивалентны, то <tex>l</tex> и <tex>l'</tex> эквивалентны. Аналогично для всех <tex>a_{i}</tex>. В итоге получим, что <tex>u</tex> эквивалентно <tex>u'</tex>. Значит для каждого состояния из <tex>A_{min}</tex> существует эквивалентное состояние из <tex>A'</tex><br>Состояний в <tex>A'</tex> меньше чем в <tex>A_{min}</tex>, значит двум состояниям из <tex>A_{min}</tex> эквивалентно одно состояние из <tex>A'</tex>. Тогда эти два состояния эквивалентны, но автомат <tex>A_{min}</tex> построен так, что в нем нет эквивалентных состояний. Противоречие.<br>Так как каждому состоянию из <tex>A_{min}</tex> эквивалентно состояние из <tex>A'</tex>, то автоматы <tex>A_{min}</tex> и <tex>A'</tex> изоморфны.
==Время работы алгоритма==Каждую пару мы добавляли в очередь один раз, значит время заполнения таблицы Шаг <tex>O(n^2)6 </tex>. Разбиение на классы эквивалентности делается за один проход по таблице, то есть за <tex>O(n^2)</tex>.===Итого получили такой автомат:
==Пример==Минимизируем данный автомат. <br>[[Файл:dkadkaMin.jpgpng]]<br>Будем рассматривать только нижний треугольник таблицы пар различимых состояний. <br>Отметили состояния, различающиеся строкой <tex>\varepsilon</tex>{| border = "1" |B | |colspan = "6"| |- |C | | |colspan = "5"| |- |D | | | |colspan = "4"| |- |E | | | | |colspan = "3"| |- |F |x |x |x |x |x |colspan = "2"| |- |G |x |x |x |x |x | |colspan = "1"| |- |H | | | | | |x |x |- | |A |B |C |D |E |F |G |}
== См. также ==
* [[Минимизация ДКА, алгоритм Хопкрофта (сложность O(n log n))]]
На момент опустошения очереди{| border = "1" |B | |colspan = "6"|Источники информации== |* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' Введение в теорию автоматов, языков и вычислений, 2-е издание. Пер. с англ. — М.: Издательский дом «Вильямс», 2002. — С. 171 - |C |x |x |colspan = "182. — ISBN 5"| |- |D |x |x | |colspan = "8459-0261-4"| * [[wikipedia:ru:DFA_minimization |Wikipedia {{-- |E |x |x |x |x |colspan = "3"| |-}} DFA minimization]] |F |x |x |x |x |x |colspan = * [http://www.eecs.berkeley.edu/~sseshia/172/lectures/Lecture6.pdf Sanjit A. Seshia, "2Minimization of DFAs"|] |* [http://www.comp.nus.edu.sg/~cs4212/dfa- |G |x |x |x |x |x | |colspan = min.pdf National University of Singapore, "1DFA Minimization"| |- |H |x |x |x |x |x |x |x |- | |A |B |C |D |E |F |G |}]
Из таблицы видно, что классы эквивалентных состояний это <tex> \mathcal {f} A, B \mathcal {g}, \mathcal {f} C, D \mathcal {g}, \mathcal {f} F, G \mathcal {g}, \mathcal {f} E \mathcal {g}, \mathcal {f} H \mathcal {g} </tex>. <br>[[Категория: Теория формальных языков]]Итого получили такой автомат[[Категория: <br> Автоматы и регулярные языки]][[ФайлКатегория:dkaMin.jpgМинимизация ДКА ]]
1632
правки

Навигация