- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
確定有穷自动机最小化算法的研究
确定有穷自动机最小化算法的研究
计科0803 姜斌 200740109
《对确定有限自动机最小化算法的改进》的错误指正
在阅读了在《桂林航天工业高等专科学校学报》2005年第4期,由徐红老师发表的《对确定有限自动机最小化算法的改进》一文后,我发现徐老师在分析DFA最小化的过程中出现了错误。
原文提到的“确定有限自动机的化简算法(DFA 极小化算法)”,即所谓的原始算法,原文中对于算法的描述是这样的:
(1) 首先把状态集S 分成终态集和非终态集,因为终态集可接受ε, 而非终态集则不能, 所以他们是可区分的。这就是基本划分:π= { Q, K - Q} 。
(2) 假定经过k 次划分后,已含有m 个子集,π= { I1 , I2 , ?, Im} ,则对每一个Ii 和每一个a ∈Σ。考察: I i a = f ( I i , a) , 如I i a 中的状态分别落于π中P 个不同的子集,则子集I i 将被P 个更小的状态子集I i1 , I i2 , ?, I i p 所细分。令细分后所得的状态集合为πnew。
(3) 重复步骤2 ,直到直至所含的子集数不再增加为止。即πnew =π。
(4) 对π中的每个子集I i ,若该子集包含原有的初态,则此代表状态便为最小化后M 的初态;若该子集包含原有的终态, 则此状态便为最小化后M 的终态。
(5) 删去状态集中的所有死状态。
徐老师认为,该算法在刚开始只是简单地将状态集分成了终态集和非终态集两个部分,而忽视了初始状态的特殊地位,于是徐老师认为应该将初始状态单独作为一个集合,在完成了所有集合的划分之后再与最近的集合进行合并的判断。并且徐老师还举了一个例子来说明。
给定如图1.1所示的确定有穷自动机。
图1.1
徐老师在使用原始算法分析时,给出如下分析“因为{ 0 ,1} a = { 1} ∈{ 0 ,1} ;{ 0 ,1} b = { 2} ∈{ 2 ,3},所以{ 0 ,1} 不用再划分。”
很显然,徐老师在分析“{ 0 ,1} b = { 2} ∈{ 2 ,3}”时发生了错误。原DFA中0状态点并没有经过b到达的状态,而1状态有经过b可达的一个终态2,显然b这个串可以区分0与1这两个状态,也就是说0与1应该划分。
而徐老师由于这个错误的产生,导致了对原算法的理解出错。而徐老师提出的将原初态作为单独一个集合的做法,我认为是完全没有必要的,所谓的改进算法只不过是额外地增加操作量罢了。不过原算法确实存在着初始集合的划分问题,下文中会给出一种解决方案。
对《一种将NFA 到最小化DFA 的方法》的学习与研究
方法引入
由毛红梅,聂承启两位老师在计算机与现代化2004年第10期上发表的《一种将NFA 到最小化DFA 的方法》一文中提到了一种将DFA最小化的方法,即“用树型分割法实现从DFA 到最小化DFA 的转化”,其具体实现如下:
(1) 首先将DFA 所有的状态分割成可接受状态和不可接受状态集;
(2) 用双圆圈来标记最大等价状态集;
(3) 将DFA 所有输入字母按某一顺序排列;
(4) 依次输入字母进行判断,直到求出最大集为止。
如图2.1所示。
图2.1 图2.2
这种做法较《编译原理》一书上所讲述方法而言更为直观,故而我采用了这种方法并尝试实现,在实际编程过程中发现,有几个很重要的地方两位老师并没有提到。所以我在此提出我的实现,作为补充。
第一,有些状态对于某些输入字母并不是都有下个状态,即会出现输入字母无到达状态的情况。
第二,初始集合如何确定划分。
第三,具体如何划分集合。
我的实现
第一,有些状态对于某些输入字母并不是都有下个状态,即会出现输入字母无到达状态的情况。对于这种情况,我的解决办法是在新状态组中增加一个“空状态”,并将其置于新状态集合的最开始。当出现输入无到达状态时就指向该“空状态”,这样在进行集合划分的时候就有了比较的具体数值,更易于实现。
第二,初始集合的划分。文中只是简单地提到将初始集合划分为接受状态和不可接受状态,即终态和非终态,然而这样的划分会遇到新状态集合的初始态位置不确定的情况。故而,需要注意的一点是,原初始态应该先确定放于新状态集合中的开始位置,在我的实现中,是将原初始态默认放于“空状态”的下一个位置,并且把有相同属性(终态或非终态)的状态一齐放入,而将剩余的状态放入第三个位置。如图2.2所示。
第三,如何划分集合。两位老师只是很简单地提到,对于输入字母到达的下一个状态处于不同的状态集合中就需要对该组状态进行划分。我的实现是,先取出需要处理的一个状态集合s中所有状态并放入临时状态组t中,如果只有一个状态则直接跳过,如果有多个,则逐个进行输入判断。判断时,首先将第一个状态放回状态集合中,并
文档评论(0)