Эквивалентность состояний ДКА — различия между версиями
Строка 18: | Строка 18: | ||
[[Файл:avtomat2.png|350px]] [[Файл:avtomat3.png|350px]] | [[Файл:avtomat2.png|350px]] [[Файл:avtomat3.png|350px]] | ||
− | Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита <tex> \lbrace 0, 1\rbrace </tex>. | + | Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита <tex> \lbrace 0, 1\rbrace </tex>. Стартовые и все допускающие состояния автоматов эквивалентны между собой. |
{{Лемма | {{Лемма | ||
Строка 66: | Строка 66: | ||
for <tex> \delta(e_1, c) = p_1 </tex> | for <tex> \delta(e_1, c) = p_1 </tex> | ||
for <tex> \delta(e_2, c) = p_2 </tex> | for <tex> \delta(e_2, c) = p_2 </tex> | ||
+ | if neq[<tex>e_1</tex>, <tex>e_2</tex>] | ||
+ | continue | ||
q.push(<tex>e_1</tex>, <tex>e_2</tex>) | q.push(<tex>e_1</tex>, <tex>e_2</tex>) | ||
neq[<tex>e_1</tex>, <tex>e_2</tex>] = True | neq[<tex>e_1</tex>, <tex>e_2</tex>] = True | ||
Строка 74: | Строка 76: | ||
</font> | </font> | ||
===Время работы алгоритма=== | ===Время работы алгоритма=== | ||
− | + | Оценим время работы алгоритма. Заметим, что каждая пара состояния будет добавлена в очередь, не более одного раза. Поэтому цикл ''while'' выполнится не более чем <tex> |Q_1|\cdot |Q_2| </tex> раз. А значит в этом же цикле каждая пара ребер будет просмотрена не более одного раза, потому что для каждой вершины мы просматриваем все входящие ребра. А значит внутренний <font size = 3><tt> if neq[<tex>e_1</tex>, <tex>e_2</tex>] </tt> </font> выполнится порядка <tex> |Q_1||Q_2||\Sigma|^2 </tex>, потому что это верхняя оценка на количество ребер в детерминированном автомате {{---}} <tex> |Q||\Sigma|</tex>. | |
+ | А значит алгоритм будет работать за <tex> O(|Q_1||Q_2||\Sigma|^2)</tex>. | ||
[[Категория: Теория формальных языков]] | [[Категория: Теория формальных языков]] | ||
[[Категория: Автоматы и регулярные языки]] | [[Категория: Автоматы и регулярные языки]] |
Версия 08:10, 21 января 2012
Определение: |
Два автомата | и называются эквивалентными, если они распознают один и тот же язык над алфавитом , то есть .
Определение: |
Слово
| различает два состояния и , если
Определение: |
Два состояния
| и называются эквивалентными , если не существует строки, которая их различает, то есть верно, что
Заметим, что эквивалентность состояний действительно является отношением эквивалентности. Так как (равносильность) является отношением эквивалентности и , поэтому описанное нами отношение является отношением эквивалентности.
Содержание
Пример
Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита
. Стартовые и все допускающие состояния автоматов эквивалентны между собой.Лемма: |
, , , различает и . Тогда различает и . |
Доказательство: |
А значит, по условию различимости для и , |
Алгоритм проверки эквивалентности автоматов
Постановка задачи
Даны два детерминированных конечных автомата
и . Требуется определить, эквивалентны ли они.Алгоритм
Рассмотрим такие семейства множеств:
- различает и ;
- .
Для
существует рекуррентная формула:- .
То есть
— объединение множества всех пар состояний, которые различаются строками длины меньшей с множеством всех пар состояний, которые различаются строками длины ровно .Заметим, что
, причем . Также заметим, что , так как в новых элементов не добавится, поэтому . Значит:- различает и .
Осталось найти такое
и , что тогда мы узнаем пары неэквивалентных состояний, останется только проверить, что , тогда автоматы будут эквивалентны.Будем строить
в порядке увеличения , пока . Заметим, что , так как строка длины 0 одна — это , а различает только пары состоящие из одного терминального состояния и одного нетерминального.Дальше будем получать
по рекуррентной формуле, пока не выполнится условие остановки.Это можно реализовать проще: будем хранить для каждого состояния, из какого состояния есть переход по символу
в наше. В очередь будем класть пары неэквивалентных состояний. Дальше вытаскивая из очереди пару, рассмотрим все пары состояний, из которых есть переход по одинаковому символу в элементы пары из очереди. Пометим их неэквивалентными и положим в очередь.Псевдокод
fill(neq, false) for for if q.push( , ) neq[ , ] = True while not isEmpty(q) = q.pop() for for for if neq[ , ] continue q.push( , ) neq[ , ] = True if neq[ , ] print("Not equivalent") else print("Equivalent")
Время работы алгоритма
Оценим время работы алгоритма. Заметим, что каждая пара состояния будет добавлена в очередь, не более одного раза. Поэтому цикл while выполнится не более чем
раз. А значит в этом же цикле каждая пара ребер будет просмотрена не более одного раза, потому что для каждой вершины мы просматриваем все входящие ребра. А значит внутренний if neq[ , ] выполнится порядка , потому что это верхняя оценка на количество ребер в детерминированном автомате — . А значит алгоритм будет работать за .