<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.55.165.38&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.55.165.38&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/95.55.165.38"/>
		<updated>2026-05-24T20:16:11Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%BA%D0%B2%D0%B8%D0%B2%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%94%D0%9A%D0%90&amp;diff=43722</id>
		<title>Эквивалентность состояний ДКА</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%BA%D0%B2%D0%B8%D0%B2%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%94%D0%9A%D0%90&amp;diff=43722"/>
				<updated>2015-01-09T14:46:58Z</updated>
		
		<summary type="html">&lt;p&gt;95.55.165.38: /* Проверка через BFS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Связь эквивалентности состояний и различимости состояний ==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Два  автомата &amp;lt;tex&amp;gt; \mathcal{A}_1 = \langle Q_1,\Sigma,\delta_1,s_{1}, T_1\subseteq Q_1 \rangle &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathcal{A}_2 = \langle Q_2,\Sigma,\delta_2,s_{2}, T_2\subseteq Q_2 \rangle &amp;lt;/tex&amp;gt; называются '''эквивалентными''' (англ. ''equivalent''), если они распознают один и тот же язык над алфавитом &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;\mathcal{L}(\mathcal{A}_1) = \mathcal{L}(\mathcal{A}_2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = [[Основные определения, связанные со строками#string|Слово]] &amp;lt;tex&amp;gt;z \in \Sigma^*&amp;lt;/tex&amp;gt; '''различает''' (англ. ''distinguish'')  два состояния &amp;lt;tex&amp;gt;q_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;q_j&amp;lt;/tex&amp;gt;, если &lt;br /&gt;
* &amp;lt;tex&amp;gt; \langle q_i, z \rangle \vdash^* \langle t_1, \varepsilon \rangle, \langle q_j, z \rangle \vdash^* \langle t_2, \varepsilon \rangle \Rightarrow (t_1 \notin T \Leftrightarrow t_2 \in T) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Два &amp;lt;em&amp;gt; состояния&amp;lt;/em&amp;gt; &amp;lt;tex&amp;gt;q_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;q_j&amp;lt;/tex&amp;gt; называются '''эквивалентными''' &amp;lt;tex&amp;gt;(q_i \sim q_j)&amp;lt;/tex&amp;gt;, если не существует [[Основные определения, связанные со строками#string|строки]], которая их различает, то есть &amp;lt;tex&amp;gt;\forall z \in \Sigma^*&amp;lt;/tex&amp;gt;  верно, что&lt;br /&gt;
* &amp;lt;tex&amp;gt; \langle q_i, z \rangle \vdash^* \langle t_1, \varepsilon \rangle, \langle q_j, z \rangle \vdash^* \langle t_2, \varepsilon \rangle \Rightarrow (t_1 \in T \Leftrightarrow t_2 \in T) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Заметим, что эквивалентность состояний действительно является [[Отношение эквивалентности|отношением эквивалентности]]. Так как &amp;lt;tex&amp;gt; \Leftrightarrow &amp;lt;/tex&amp;gt; (равносильность) является отношением эквивалентности и в детерминированном автомате всегда существует путь по любому слову, описанное нами отношение является отношением эквивалентности.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement =&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathcal{A} = \langle Q, \Sigma, \delta, s, T \rangle &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; p_1, p_2, q_1, q_2 \in Q &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; q_i = \delta(p_i, c) &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; w \in \Sigma^*&amp;lt;/tex&amp;gt; различает &amp;lt;tex&amp;gt; q_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q_2 &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;cw&amp;lt;/tex&amp;gt; различает &amp;lt;tex&amp;gt; p_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; p_2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof = &lt;br /&gt;
&amp;lt;tex&amp;gt; \langle p_i, cw \rangle \vdash \langle q_i, w \rangle \vdash^* \langle t_i, \varepsilon \rangle &amp;lt;/tex&amp;gt;&lt;br /&gt;
А значит, по условию различимости для &amp;lt;tex&amp;gt; q_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q_2&amp;lt;/tex&amp;gt; , &amp;lt;tex&amp;gt; t_1 \in T \Leftrightarrow t_2 \notin T &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
[[Файл:avtomat2.png|200px]] [[Файл:avtomat3.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита &amp;lt;tex&amp;gt; \lbrace 0, 1\rbrace &amp;lt;/tex&amp;gt;. Стартовые и все допускающие состояния автоматов эквивалентны между собой.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Автоматы и регулярные языки]]&lt;br /&gt;
&lt;br /&gt;
== Проверка ДКА на эквивалентность ==&lt;br /&gt;
Заданы два автомата: &amp;lt;tex&amp;gt; \mathcal{A}_1 &amp;lt;/tex&amp;gt; со стартовым состоянием &amp;lt;tex&amp;gt; s_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \mathcal{A}_2 &amp;lt;/tex&amp;gt; со стартовым состоянием &amp;lt;tex&amp;gt; s_2 &amp;lt;/tex&amp;gt; соответственно. Нужно проверить их на эквивалентность.&lt;br /&gt;
&lt;br /&gt;
'''Замечание:''' для реализации оба автомата обязательно должны иметь [[Детерминированные_конечные_автоматы#допускает|дьявольские состояния]].&lt;br /&gt;
=== Проверка через минимизацию ===&lt;br /&gt;
Для этого построим автомат &amp;lt;tex&amp;gt; \mathcal{A} &amp;lt;/tex&amp;gt;, содержащий все состояния обоих автоматов и изначальные переходы между ними. Стартовым состоянием в новом автомате можно сделать &amp;lt;tex&amp;gt; s_1 &amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt; s_2 &amp;lt;/tex&amp;gt; — это не имеет значения. При этом состояния одного из автоматов станут недостижимыми из новой стартовой вершины в новом автомате, но для алгоритма это и не важно.&amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:auto_equiq.png|470px]]&amp;lt;br&amp;gt;&lt;br /&gt;
Осталось лишь проверить на эквивалентность состояния &amp;lt;tex&amp;gt; s_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; s_2 &amp;lt;/tex&amp;gt; в полученном автомате. Их эквивалентность совпадает с эквивалентностью автоматов &amp;lt;tex&amp;gt; \mathcal{A}_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \mathcal{A}_2 &amp;lt;/tex&amp;gt;. Для этого можно применить [[Минимизация_ДКА,_алгоритм_за_O(n%5E2)_с_построением_пар_различимых_состояний|алгоритм минимизации ДКА]], который разбивает все состояния на классы эквивалентности. Если состояния &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;s_2&amp;lt;/tex&amp;gt; нового автомата в одном классе эквивалентности {{---}} исходные автоматы эквивалентны.&lt;br /&gt;
&lt;br /&gt;
Также можно минимизировать каждый автомат отдельно и проверить минимизированные версии на изоморфизм.&lt;br /&gt;
&lt;br /&gt;
=== Проверка через BFS ===&lt;br /&gt;
Два автомата можно также проверить на эквивалентность, используя [[Обход в ширину | обход в ширину]]. Будем синхронно обходить два автомата, начиная со стартовых состояний, в поисках такой строки, которая различает два состояния этих автоматов. То есть она будет допускаться одним автоматом, но не будет принадлежать языку другого.&lt;br /&gt;
&lt;br /&gt;
Поскольку эквивалентные автоматы допускают один и тот же язык, при переходе по одним и тем же символам в обоих автоматах, слово должно приниматься обоими автоматами одновременно. То есть вершины, в которые мы перешли, должны быть либо одновременно терминальными, либо одновременно нетерминальными, что и проверяет приведённый алгоритм. &lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&amp;lt;wikitex&amp;gt;&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// $\mathtt{aut}[i][c]$ {{---}} номер состояния, в которое есть переход из состояния $i$ по символу $c$&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''boolean''' $\mathtt{bfsEquivalenceCheck}$($\mathtt{aut1}$ : '''int[][]''', $\mathtt{aut2}$ : '''int[][]'''):&lt;br /&gt;
     $Q.\mathtt{push}(\langle s_1, s_2 \rangle) $ &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; {{---}} очередь из пар состояний&amp;lt;/font&amp;gt;&lt;br /&gt;
     $\mathtt{used1}[s_1]  \leftarrow $ ''true''&lt;br /&gt;
     $\mathtt{used2}[s_2]  \leftarrow $ ''true''&lt;br /&gt;
     '''while''' $Q \ne \varnothing $ &lt;br /&gt;
         $u, v \leftarrow Q.\mathtt{pop}()$&lt;br /&gt;
         '''if''' $\mathtt{isTerminal1[u]} \ne \mathtt{isTerminal2[v]}$&lt;br /&gt;
             '''return''' ''false''&lt;br /&gt;
         '''for''' $c \in \Sigma$&lt;br /&gt;
             '''if''' '''not''' $\mathtt{used1[aut1}[u][c]]$ '''or''' '''not''' $\mathtt{used2[aut2}[v][c]]$&lt;br /&gt;
                 $Q.\mathtt{push}(\langle \mathtt{aut1}[u][c], \mathtt{aut2}[v][c] \rangle)$&lt;br /&gt;
                 $\mathtt{used1[aut1}[u][c]] \leftarrow $ ''true''&lt;br /&gt;
                 $\mathtt{used2[aut2}[v][c]] \leftarrow $ ''true''&lt;br /&gt;
     '''return''' ''true''&lt;br /&gt;
&lt;br /&gt;
Корректность алгоритма следует из строго доказательства того факта, что если два состояния $u$ и $v$ различаются какой-то строкой, то они различаются строкой длины $O(n)$.&lt;br /&gt;
&lt;br /&gt;
Интуитивное понимание алгоритма такое: пусть по строке $w$ мы пришли в состояния  $ \langle u, v \rangle $, и пусть они оба нетерминальные. После этого совершим переход по символу $c$ в состояния $ \langle u', v' \rangle $. &lt;br /&gt;
&lt;br /&gt;
Тогда если $\mathtt{isTerminal1[u']} \ne \mathtt{isTerminal2[v']}$, то строка $wc$ различает эти два состояния. А значит автоматы не эквивалентны.&lt;br /&gt;
&amp;lt;/wikitex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См. также == &lt;br /&gt;
* [[Минимизация_ДКА,_алгоритм_за_O(n%5E2)_с_построением_пар_различимых_состояний|Алгоритм минимизации ДКА]]&lt;br /&gt;
* [[Минимизация ДКА, алгоритм Хопкрофта (сложность O(n log n))]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://stackoverflow.com/questions/6905043/equivalence-between-two-automata/12623361#12623361 StackOverflow {{---}} Equivalence between two automata]&lt;/div&gt;</summary>
		<author><name>95.55.165.38</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%BA%D0%B2%D0%B8%D0%B2%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%94%D0%9A%D0%90&amp;diff=43721</id>
		<title>Эквивалентность состояний ДКА</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%BA%D0%B2%D0%B8%D0%B2%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B9_%D0%94%D0%9A%D0%90&amp;diff=43721"/>
				<updated>2015-01-09T14:43:06Z</updated>
		
		<summary type="html">&lt;p&gt;95.55.165.38: /* Проверка через BFS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Связь эквивалентности состояний и различимости состояний ==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Два  автомата &amp;lt;tex&amp;gt; \mathcal{A}_1 = \langle Q_1,\Sigma,\delta_1,s_{1}, T_1\subseteq Q_1 \rangle &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\mathcal{A}_2 = \langle Q_2,\Sigma,\delta_2,s_{2}, T_2\subseteq Q_2 \rangle &amp;lt;/tex&amp;gt; называются '''эквивалентными''' (англ. ''equivalent''), если они распознают один и тот же язык над алфавитом &amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;\mathcal{L}(\mathcal{A}_1) = \mathcal{L}(\mathcal{A}_2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = [[Основные определения, связанные со строками#string|Слово]] &amp;lt;tex&amp;gt;z \in \Sigma^*&amp;lt;/tex&amp;gt; '''различает''' (англ. ''distinguish'')  два состояния &amp;lt;tex&amp;gt;q_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;q_j&amp;lt;/tex&amp;gt;, если &lt;br /&gt;
* &amp;lt;tex&amp;gt; \langle q_i, z \rangle \vdash^* \langle t_1, \varepsilon \rangle, \langle q_j, z \rangle \vdash^* \langle t_2, \varepsilon \rangle \Rightarrow (t_1 \notin T \Leftrightarrow t_2 \in T) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Два &amp;lt;em&amp;gt; состояния&amp;lt;/em&amp;gt; &amp;lt;tex&amp;gt;q_i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;q_j&amp;lt;/tex&amp;gt; называются '''эквивалентными''' &amp;lt;tex&amp;gt;(q_i \sim q_j)&amp;lt;/tex&amp;gt;, если не существует [[Основные определения, связанные со строками#string|строки]], которая их различает, то есть &amp;lt;tex&amp;gt;\forall z \in \Sigma^*&amp;lt;/tex&amp;gt;  верно, что&lt;br /&gt;
* &amp;lt;tex&amp;gt; \langle q_i, z \rangle \vdash^* \langle t_1, \varepsilon \rangle, \langle q_j, z \rangle \vdash^* \langle t_2, \varepsilon \rangle \Rightarrow (t_1 \in T \Leftrightarrow t_2 \in T) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Заметим, что эквивалентность состояний действительно является [[Отношение эквивалентности|отношением эквивалентности]]. Так как &amp;lt;tex&amp;gt; \Leftrightarrow &amp;lt;/tex&amp;gt; (равносильность) является отношением эквивалентности и в детерминированном автомате всегда существует путь по любому слову, описанное нами отношение является отношением эквивалентности.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement =&lt;br /&gt;
&amp;lt;tex&amp;gt; \mathcal{A} = \langle Q, \Sigma, \delta, s, T \rangle &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; p_1, p_2, q_1, q_2 \in Q &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; q_i = \delta(p_i, c) &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; w \in \Sigma^*&amp;lt;/tex&amp;gt; различает &amp;lt;tex&amp;gt; q_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q_2 &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;cw&amp;lt;/tex&amp;gt; различает &amp;lt;tex&amp;gt; p_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; p_2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof = &lt;br /&gt;
&amp;lt;tex&amp;gt; \langle p_i, cw \rangle \vdash \langle q_i, w \rangle \vdash^* \langle t_i, \varepsilon \rangle &amp;lt;/tex&amp;gt;&lt;br /&gt;
А значит, по условию различимости для &amp;lt;tex&amp;gt; q_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q_2&amp;lt;/tex&amp;gt; , &amp;lt;tex&amp;gt; t_1 \in T \Leftrightarrow t_2 \notin T &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
[[Файл:avtomat2.png|200px]] [[Файл:avtomat3.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита &amp;lt;tex&amp;gt; \lbrace 0, 1\rbrace &amp;lt;/tex&amp;gt;. Стартовые и все допускающие состояния автоматов эквивалентны между собой.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Автоматы и регулярные языки]]&lt;br /&gt;
&lt;br /&gt;
== Проверка ДКА на эквивалентность ==&lt;br /&gt;
Заданы два автомата: &amp;lt;tex&amp;gt; \mathcal{A}_1 &amp;lt;/tex&amp;gt; со стартовым состоянием &amp;lt;tex&amp;gt; s_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \mathcal{A}_2 &amp;lt;/tex&amp;gt; со стартовым состоянием &amp;lt;tex&amp;gt; s_2 &amp;lt;/tex&amp;gt; соответственно. Нужно проверить их на эквивалентность.&lt;br /&gt;
&lt;br /&gt;
'''Замечание:''' для реализации оба автомата обязательно должны иметь [[Детерминированные_конечные_автоматы#допускает|дьявольские состояния]].&lt;br /&gt;
=== Проверка через минимизацию ===&lt;br /&gt;
Для этого построим автомат &amp;lt;tex&amp;gt; \mathcal{A} &amp;lt;/tex&amp;gt;, содержащий все состояния обоих автоматов и изначальные переходы между ними. Стартовым состоянием в новом автомате можно сделать &amp;lt;tex&amp;gt; s_1 &amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt; s_2 &amp;lt;/tex&amp;gt; — это не имеет значения. При этом состояния одного из автоматов станут недостижимыми из новой стартовой вершины в новом автомате, но для алгоритма это и не важно.&amp;lt;br&amp;gt;&lt;br /&gt;
[[Файл:auto_equiq.png|470px]]&amp;lt;br&amp;gt;&lt;br /&gt;
Осталось лишь проверить на эквивалентность состояния &amp;lt;tex&amp;gt; s_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; s_2 &amp;lt;/tex&amp;gt; в полученном автомате. Их эквивалентность совпадает с эквивалентностью автоматов &amp;lt;tex&amp;gt; \mathcal{A}_1 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; \mathcal{A}_2 &amp;lt;/tex&amp;gt;. Для этого можно применить [[Минимизация_ДКА,_алгоритм_за_O(n%5E2)_с_построением_пар_различимых_состояний|алгоритм минимизации ДКА]], который разбивает все состояния на классы эквивалентности. Если состояния &amp;lt;tex&amp;gt;s_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;s_2&amp;lt;/tex&amp;gt; нового автомата в одном классе эквивалентности {{---}} исходные автоматы эквивалентны.&lt;br /&gt;
&lt;br /&gt;
Также можно минимизировать каждый автомат отдельно и проверить минимизированные версии на изоморфизм.&lt;br /&gt;
&lt;br /&gt;
=== Проверка через BFS ===&lt;br /&gt;
Два автомата можно также проверить на эквивалентность, используя [[Обход в ширину | обход в ширину]]. Будем синхронно обходить два автомата, начиная со стартовых состояний, в поисках такой строки, которая различает два состояния этих автоматов. То есть она будет допускаться одним автоматом, но не будет принадлежать языку другого.&lt;br /&gt;
&lt;br /&gt;
Поскольку эквивалентные автоматы допускают один  тот же язык, при переходе по одним и тем же символам в обоих автоматах, слово должно приниматься обоими автоматами одновременно. То есть вершины, в которые мы перешли, должны быть либо одновременно терминальными, либо одновременно нетерминальными, что и проверяет приведённый алгоритм. &lt;br /&gt;
==== Псевдокод ====&lt;br /&gt;
&amp;lt;wikitex&amp;gt;&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;// $\mathtt{aut}[i][c]$ {{---}} номер состояния, в которое есть переход из состояния $i$ по символу $c$&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''boolean''' $\mathtt{bfsEquivalenceCheck}$($\mathtt{aut1}$ : '''int[][]''', $\mathtt{aut2}$ : '''int[][]'''):&lt;br /&gt;
     $Q.\mathtt{push}(\langle s_1, s_2 \rangle) $ &amp;lt;font color=green&amp;gt;// &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; {{---}} очередь из пар состояний&amp;lt;/font&amp;gt;&lt;br /&gt;
     $\mathtt{used1}[s_1]  \leftarrow $ ''true''&lt;br /&gt;
     $\mathtt{used2}[s_2]  \leftarrow $ ''true''&lt;br /&gt;
     '''while''' $Q \ne \varnothing $ &lt;br /&gt;
         $u, v \leftarrow Q.\mathtt{pop}()$&lt;br /&gt;
         '''if''' $\mathtt{isTerminal1[u]} \ne \mathtt{isTerminal2[v]}$&lt;br /&gt;
             '''return''' ''false''&lt;br /&gt;
         '''for''' $c \in \Sigma$&lt;br /&gt;
             '''if''' '''not''' $\mathtt{used1[aut1}[u][c]]$ '''or''' '''not''' $\mathtt{used2[aut2}[v][c]]$&lt;br /&gt;
                 $Q.\mathtt{push}(\langle \mathtt{aut1}[u][c], \mathtt{aut2}[v][c] \rangle)$&lt;br /&gt;
                 $\mathtt{used1[aut1}[u][c]] \leftarrow $ ''true''&lt;br /&gt;
                 $\mathtt{used2[aut2}[v][c]] \leftarrow $ ''true''&lt;br /&gt;
     '''return''' ''true''&lt;br /&gt;
&lt;br /&gt;
Корректность алгоритма следует из строго доказательства того факта, что если два состояния $u$ и $v$ различаются какой-то строкой, то они различаются строкой длины $O(n)$.&lt;br /&gt;
&lt;br /&gt;
Интуитивное понимание алгоритма такое: пусть по строке $w$ мы пришли в состояния  $ \langle u, v \rangle $, и пусть они оба нетерминальные. После этого совершим переход по символу $c$ в состояния $ \langle u', v' \rangle $. &lt;br /&gt;
&lt;br /&gt;
Тогда если $\mathtt{isTerminal1[u']} \ne \mathtt{isTerminal2[v']}$, то строка $wc$ различает эти два состояния. А значит автоматы не эквивалентны.&lt;br /&gt;
&amp;lt;/wikitex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См. также == &lt;br /&gt;
* [[Минимизация_ДКА,_алгоритм_за_O(n%5E2)_с_построением_пар_различимых_состояний|Алгоритм минимизации ДКА]]&lt;br /&gt;
* [[Минимизация ДКА, алгоритм Хопкрофта (сложность O(n log n))]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://stackoverflow.com/questions/6905043/equivalence-between-two-automata/12623361#12623361 StackOverflow {{---}} Equivalence between two automata]&lt;/div&gt;</summary>
		<author><name>95.55.165.38</name></author>	</entry>

	</feed>