从正则表达式到 NFA 到 DFA 到最简 DFA (三)(结束)

从正则表达式到 NFA 到 DFA 到最简 DFA (三)

DFA $ \rightarrow $ 最简 DFA (Hopcroft 算法)

这是一个基于等价类的算法。

split(S)
    foreach char c
        if c 能切分 S
            split S into T1, T2, ..., TK
hopcroft()
    split all nodes into N, A(即非接收状态和接收状态)
    while (set is still changing)
        split(N/A)

这里的等价类,通俗来说就是根据某些特征来划分状态。比如某些状态,都是接收状态,就可以被分为一类。某些状态都是非接收状态,它们就是一类。然后再看每一类中是否还可以继续被划分,比如某些状态经过一次转移可以到接收状态,有些状态不可以,那么这两种状态就是不同的,可以继续分类。

例1

1778513-20190827114640972-1786106643.jpg

按照接收状态非接收状态划分,q0 单独一类,q1 q2 q3 是一类。因为 b 和 c 无法区分 q1 q2 q3 中的状态,所以这一个集合(q1, q2, q3)收缩成 q4。

1778513-20190827114647548-754428259.jpg

例2

1778513-20190827114655553-1277291280.jpg

首先,{q0, q1, q2, q4} → N,{q3, q5} → A。

然后在 N 上看各个状态接收字符 e 之后的转移,q2 和 q4 都可以转移到 A 集合中,而 q0 和 q1 不行,所以再次分类:{q2, q4} → N1,{q0, q1} → N2。

在 N1 和 A 上看各个状态接收各个字符后的转移,发现无法继续划分,所以这就是一个最简状态集了。

在 N2 上看各个状态接收各个字符后的转移,发现接收字符 e 时,q1 可以转移到 N1,而 q0 不行。所以再次划分 N1:{q1} → N21,{q0} → N22。

再看各个状态集,都不可以被继续划分了。此时到达最简 DFA。

1778513-20190827114705991-1510288964.jpg

转载于:https://www.cnblogs.com/metatronwings/p/11417473.html

1. 实验内容 每一个正规集都可以由一个状态数最少的DFA所识别,这个DFA是唯一的(不考虑同构的情况)。任意给定的一个DFA,根据以下算法设计一个C程序,将该DFA 化简为与之等价的最简DFA。 2. 实验设计分析 2.1 实验设计思路 根据实验指导书和书本上的相关知识,实现算法。 2.2 实验算法 (1)构造具有两个组的状态集合的初始划分I:接受状态组 F 和非接受状态组 Non-F。 (2)对I采用下面所述的过程来构造新的划分I-new. For I 中每个组G do Begin 当且仅当对任意输入符号a,状态s和读入a后转换到I的同一组中; /*最坏情况下,一个状态就可能成为一个组*/ 用所有新形成的小组集代替I-new中的G; end (3)如果I-new=I,令I-final=I,再执行第(4)步,否则令I=I=new,重复步骤(2)。 (4)在划分I-final的每个状态组中选一个状态作为该组的代表。这些代表构成了化简后的DFA M'状态。令s是一个代表状态,而且假设:在DFA M中,输入为a时有从s到t转换。令t所在组的代表是r,那么在M’中有一个从s到r的转换,标记为a。令包含s0的状态组的代表是M’的开始状态,并令M’的接受状态是那些属于F的状态所在组的代表。注意,I-final的每个组或者仅含F中的状态,或者不含F中的状态。 (5)如果M’含有死状态(即一个对所有输入符号都有刀自身的转换的非接受状态d),则从M’中去掉它;删除从开始状态不可到达的状态;取消从任何其他状态到死状态的转换。 。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值