NFA到DFA的转化


提示:以下是本篇文章正文内容,下面案例可供参考

NFA到DFA的转化

概念:不确定的有穷自动机(NFA)与确定的有穷自动机(DFA)从功能上来说是等价的,它们所接受的语言类相同。给定一个NFA M’,构造一个DFA M,使得L(M’) = L(M)。以下介绍两个状态子集的计算方法,转化过程需要用到。

1.状态集P的 ɛ 闭包

若P是NFA M’的状态集Q的一个子集,则ɛ - closure§称为状态集P的 ɛ 闭包。计算方法如下:

1.1 若q∈P,则q∈ɛ - closure§,即P的所有成员都是P的ɛ 闭包的成员;

1.2 若q∈P,那么从q出发经过任意条 ɛ 弧而能到达的任何状态都属于 ɛ - closure§。

举例说明:

设NFA M’如下图所示,试求P={1},P={2},P={1,2} 的 ɛ 闭包。

在这里插入图片描述

解:当P={1}时,有

∵〥(1, ɛ) = 3, 〥(3, ɛ) = 4, 〥(3, ɛ) = 6

∴ ɛ - closure({1}) = {1,3,4,6}

同理得,
ɛ - closure({2}) = {2,6}
ɛ - closure({1,2}) = {1,2,3,4,6}

2.状态集P的a弧线转换集

设P是NFA M’的状态集Q的一个子集,P={P1, P2, P3,…,Pn},a∈∑,则Pa弧转换集为:Pa= ɛ - closure(J)

其中,J = 〥(P1, ɛ) ∪〥(P2, ɛ) ∪…∪〥(Pn, ɛ)

以图一为例说明:设P={1},试求Pa

Pa = ɛ - closure(J) = ɛ - closure(〥(1, a) ) = ɛ - closure({2,4}) = {2,4,6}

NFA构造DFA:

  1. 求NFA M’开始状态q0’ 的ɛ闭包,确定DNF的开始状态q0
  2. 求开始状态q0对每个输入字符的弧转换集,确定与开始状态q0有关的状态转换函数;
  3. 对新的状态计算相关的状态转换函数;
  4. 根据产生的各个状态确定结束状态集F={p|p ∩ F‘ ≠ ∅},p为M的每个状态子集;
  5. 得到确定的有穷自动机,画出状态图或状态转换矩阵。

举例说明:

设NFA M’=(Q’, ∑’∪{ ɛ }, q0’, F’, 〥),其中Q‘ = {1,2,3,4},∑’ = {a,b,c},q0’={1},F’={4};如下图:
在这里插入图片描述

解:①求NFA M’开始状态q0’ 的ɛ闭包,确定DNF的开始状态q0

q0= ɛ - closure({q0’}) = ɛ - closure({1}) = {1, 4};

②求开始状态q0对每个输入字符的弧转换集,确定与开始状态q0有关的状态转换函数

〥(q0, a) = q0a = ɛ - closure(〥(1, a) ∪ 〥(4, a)) = {2, 3}; ---->新状态q1={2, 3}

〥(q0, b) = q0b = ∅;

〥(q0, c) = q0c = ∅;

③对新的状态计算相关的状态转换函数

〥(q1, a) = q1a = {2}; ---->新状态q2={2}

〥(q1, b) = q1b = {4}; ---->新状态q3={4}

〥(q1, c) = q1c ={3, 4}; ---->新状态q4={3, 4}

q2q3q4
〥(q2, a) = q2a = q2〥(q3, a) = q3a = ∅;〥(q4, a) = q4a = ∅;
〥(q2, b) = q2b = q3〥(q3, b) = q3a = ∅;〥(q4, b) = q4c = ∅;
〥(q2, c) = q2c = ∅;〥(q3, c) = q3b = ∅;〥(q4, c) = q4c = q4

④根据各个状态确定结束状态集F={p|p ∩ F‘ ≠ ∅},p为M的每个状态子集

∵q0={1, 4}, q1={2, 3}, q2= {2}, q3={4}, q4={3, 4} 与F‘={4} 相交不为空

∴F={q0,q3,q4}

⑤得到确定的有穷自动机,状态图或状态转换矩阵(读者可自行画出)

DFA M = ({q0, q1, q2, q3, q4}, {a, b, c}, {1, 4}, {q0, q3, q4}, 〥)

写在最后:
深入学习建议阅读《编译原理及实现》(第2版-清华大学出版社)作者 孙悦红

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值