Изменения

Перейти к: навигация, поиск
Нет описания правки
==Постановка задачи==
{{Задача|definition = Пусть дан [[Детерминированные_конечные_автоматы|автомат ]] <tex>\mathcal{A}</tex>. Требуется построить автомат <tex>A_\mathcal{A}_{min}</tex> с наименьшим количеством состояний, распознающий тот же язык, что и <tex>\mathcal{A}</tex>.}}
==Алгоритм==
Основная идея алгоритма заключается в том, чтобы разбить состояния на [[Отношение эквивалентности#Классы эквивалентности|классы эквивалентности]] — они и будут состояниями минимизированного автомата.
Для реализации алгоритма нам потребуются [[Очередь|очередь ]] <tex>Q</tex> и таблица <tex>marked</tex> размером <tex>n \times n</tex>, где <tex>n</tex> — количество состояний автомата. Будем помечать в таблице пары [[Эквивалентность состояний ДКА|неэквивалентных состояний]] и класть их в очередь.
* Удобно будем добавить в исходный автомат вершину <tex>0</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>\mathcal {9} c \in \Sigma</tex> такой, что пара <tex>\langle \delta(u, c), \delta(v, c) \rangle</tex> помечена. Тогда мы можем пометить пару <tex> \langle u, v \rangle </tex>.
===Корректность===
Пусть в результате применения данного алгоритма к автомату <tex>A</tex> мы получили автомат <tex>A_\mathcal{A}_{min}</tex>. Докажем, что этот автомат минимальный и единственный с точностью до изоморфизма.
Пусть существует автомат <tex>\mathcal{A}'</tex>, эквивалентный <tex>\mathcal{A}</tex>, но с числом состояний меньшим, чем в <tex>A_\mathcal{A}_{min}</tex>.Стартовые состояния <tex>s \in A_\mathcal{A}_{min}</tex> и <tex>s' \in \mathcal{A}'</tex> эквивалентны, так как <tex>A_\mathcal{A}_{min}</tex> и <tex>\mathcal{A}'</tex> допускают один и тот же язык. Рассмотрим строку <tex>\alpha = a_1a_2...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>A_\mathcal{A}_{min}</tex> существует эквивалентное состояние из <tex>\mathcal{A}'</tex>.
Состояний в <tex>A'</tex> меньше, чем в <tex>A_\mathcal{A}_{min}</tex>, значит двум состояниям из <tex>A_\mathcal{A}_{min}</tex> эквивалентно одно состояние из <tex>\mathcal{A}'</tex>. Тогда эти два состояния эквивалентны, но автомат <tex>A_\mathcal{A}_{min}</tex> построен так, что в нем нет эквивалентных состояний. Противоречие.
Так как каждому состоянию из <tex>A_\mathcal{A}_{min}</tex> эквивалентно состояние из <tex>\mathcal{A}'</tex>, то автоматы <tex>A_\mathcal{A}_{min}</tex> и <tex>\mathcal{A}'</tex> изоморфны.
== Псевдокод ==
Функция для построения списка обратных ребер.
'''vector'''[][] buildReverseEdges('''int''' n, '''int'''[][] <tex>\delta</tex>):
'''int''' <tex>\delta^{-1}</tex>[n][n]
'''for''' i = 0 .. n - 1
'''for''' c <tex>\in</tex> <tex>\Sigma</tex>
<tex>\delta^{-1}</tex>[<tex>\delta</tex>[i][c]][c].add(i)
'''return''' <tex>\delta^{-1}</tex>
 
Функция для проверки достижимости состояний.
'''function''' checkReachability('''int''' u, '''boolean'''[] visited):
visited[u] = true
'''for''' c <tex>\in</tex> <tex>\Sigma</tex>
'''if''' '''not''' visited[<tex>\delta</tex>[u][c]]
checkReachability(<tex>\delta</tex>[u][c], visited)
 
Функция для инициализации таблицы неэквивалентности.
'''function''' initTable('''int''' n, '''boolean'''[] isTerminal, '''queue''' Q, '''boolean'''[][] marked):
Функция для вычисления таблицы неэквивалентности.
'''function''' computeTable('''int''' n, '''intlist'''[][] <tex>\delta^{-1}</tex>, '''queue''' Q, '''boolean'''[][] marked):
'''while''' '''not''' Q.isEmpty()
<tex>\langle u, v \rangle</tex> = Q.poll()
'''function''' minimization('''int''' n, '''boolean'''[] isTerminal, '''int'''[][] <tex>\delta</tex>):
<font color="green">// Шаг 1</font>
'''intlist'''[][] <tex>\delta^{-1}</tex> = buildReverseEdges(n, <tex>\delta</tex>)<font color="green">// Cтроим список обратных ребер.</font>
<font color="green">// Шаг 2</font>
'''boolean''' reachable[n]
checkReachability(1, reachable) <font color="green">// Cтроим таблицу достижимости состояний.</font>
<font color="green">// Шаг 3</font>
'''queue''' Q
component[j] = components_count
<font color="green">// Шаг 6</font>
'''for''' i = 0 .. lengthbuildDFA(classes) - 1 '''int''' u = component[classes[i]] '''for''' c <tex>\in</tex> <tex>\Sigma</tex> if reachable[<tex>\delta</tex>[classes[i]][c]] '''and''' , component[<tex>\delta</tex>[classes[i]][c]] != 0 int v = component[<tex>\delta</tex>[classes[i]][c]] output(u ->[c]-> v) <font color="green">// Ребро из u в v Строим по символу cклассам эквивалентности требуемый автомат.</font>
==АсимптотикиАсимптотика==Поиск недостижимых состояний с помощью [[Обход_в_глубину,_цвета_вершин|обхода в глубину]] требует <tex>O(n \cdot |\Sigma|)</tex> времени. Каждую пару мы добавляли в очередь один раз, значит время заполнения таблицы <tex>O(n^2)</tex>. Разбиение на классы эквивалентности делается за один проход по таблице, то есть за <tex>O(n^2)</tex>.
==Пример работы==
[[Файл:dkaMin.png]]
 
== См. также ==
* [[Минимизация ДКА, алгоритм Хопкрофта (сложность O(n log n))]]
==Источники информации==
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' Введение в теорию автоматов, языков и вычислений, 2-е издание. Пер. с англ. — М.: Издательский дом «Вильямс», 2002. — С. 171 - 182. — ISBN 5-8459-0261-4
* [http[wikipedia:ru://en.wikipedia.org/wiki/DFA_minimization |Wikipedia:DFA_minimization{{---}} DFA minimization]]* [http://www.eecs.berkeley.edu/~sseshia/172/lectures/Lecture6.pdf Sanjit A. Seshia, "Minimization of DFAs"]* [http://www.comp.nus.edu.sg/~cs4212/dfa-min.pdf National University of Singapore, "DFA Minimization"]
[[Категория: Теория формальных языков]]
[[Категория: Автоматы и регулярные языки]]
418
правок

Навигация