📜  从 NFA 到 DFA 的转换

📅  最后修改于: 2022-05-13 02:24:08.237000             🧑  作者: Mango

从 NFA 到 DFA 的转换

NFA 可以在给定的输入符号上从给定状态有零次、一次或多次移动。 NFA 也可以有 NULL 移动(没有输入符号的移动)。另一方面,DFA 在给定输入符号上从给定状态有一个且只有一个移动。

从 NFA 到 DFA 的转换
假设有一个 NFA N < Q, ∑, q0, δ, F > 可以识别语言 L。那么可以为语言 L 构造 DFA D < Q', ∑, q0, δ', F' > 为:
第 1 步:最初 Q' = ɸ。
第 2 步:将 q0 添加到 Q'。
步骤 3:对于 Q' 中的每个状态,使用 NFA 的转移函数找到每个输入符号的可能状态集。如果这组状态不在 Q' 中,则将其添加到 Q'。
步骤 4:DFA 的最终状态将是所有包含 F 的状态(NFA 的最终状态)

例子
考虑图 1 所示的以下 NFA。

以下是 NFA 的各种参数。
Q = { q0, q1, q2 }
∑ = ( a, b )
F = { q2 }
δ(NFA 的转移函数)

第 1 步:Q' = ɸ
第 2 步:Q' = {q0}
第 3 步:对于 Q' 中的每个状态,找到每个输入符号的状态。
目前,Q'中的状态为q0,使用NFA的转移函数在输入符号a和b上找到从q0开始的移动,并更新DFA的转移表。

δ'(DFA 的转移函数)

现在 { q0, q1 } 将被视为单个状态。由于它的条目不在 Q' 中,因此将其添加到 Q'。
所以 Q' = { q0, { q0, q1 } }

现在,从状态 { q0, q1 } 在不同输入符号上的移动不存在于 DFA 的转换表中,我们将计算如下:
δ' ( { q0, q1 }, a ) = δ ( q0, a ) ∪ δ ( q1, a ) = { q0, q1 }
δ' ( { q0, q1 }, b ) = δ ( q0, b ) ∪ δ ( q1, b ) = { q0, q2 }
现在我们将更新 DFA 的转换表。

δ'(DFA 的转移函数)

现在 { q0, q2 } 将被视为单个状态。由于它的条目不在 Q' 中,因此将其添加到 Q'。
所以 Q' = { q0, { q0, q1 }, { q0, q2 } }

现在,从状态 {q0, q2} 在不同输入符号上的移动不会出现在 DFA 的转换表中,我们将计算如下:
δ' ( { q0, q2 }, a ) = δ ( q0, a ) ∪ δ ( q2, a ) = { q0, q1 }
δ' ( { q0, q2 }, b ) = δ ( q0, b ) ∪ δ ( q2, b ) = { q0 }
现在我们将更新 DFA 的转换表。

δ'(DFA 的转移函数)

由于没有生成新的状态,我们完成了转换。 DFA 的最终状态将是具有 q2 作为其分量的状态,即 { q0, q2 }

以下是 DFA 的各种参数。
Q' = { q0, { q0, q1 }, { q0, q2 } }
∑ = ( a, b )
F = { { q0, q2 } } 和转换函数δ' 如上所示。上述 NFA 的最终 DFA 如图 2 所示。

注意:有时,将正则表达式转换为 DFA 并不容易。首先,您可以将正则表达式转换为 NFA,然后将 NFA 转换为 DFA。

问题:正则表达式 (0 + 1)* (10) 对应的最小确定性有限自动机中的状态数是____________。
解决方案:首先,我们将为上述表达式制作一个 NFA。为了对 (0 + 1)* 进行 NFA,NFA 将在输入符号 0 或 1 上处于相同的状态 q0。然后对于连接,我们将添加两个移动(对于 1,q0 到 q1,对于 0 q1 到 q2),如图所示在图 3 中。



本文由 Sonal Tuteja 提供。