从正则表达式到 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

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

例2

首先,{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。

原文地址:https://www.cnblogs.com/metatronwings/p/11417473.html

时间: 2024-10-09 09:49:43

从正则表达式到 NFA 到 DFA 到最简 DFA (三)(结束)的相关文章

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

从正则表达式到 NFA 到 DFA 到最简 DFA (二) NFA $ \rightarrow $ DFA (子集构造法) 这里我们用一个例子来解释. 如上图所示,这是上一篇文章中的正则表达式化成的 NFA,这里拿来接着用. 我们首先看开始状态 n0.n0 在接收了一个字符 a 之后可以转换到 n1,这个时候我们要看 n1 是否存在 $ \varepsilon $ 转移.若存在,则递归的将所有能 $ \varepsilon $ 转移的状态添加到一个集合里(包括 n1).然后再看我们所创造的这个集

java实现正则表达式到NFA的转换

我用java实现了一个正则表达式到NFA的转换程序,以下是我的代码 package com.siwanghu.regextoNFA; public class Node {     private int id;     private static int ID=0;          public Node(){      this.id=ID++;     } public int getId() { return id; } public static void reset(){ ID=

从正则表达式构造ε-NFA

来自 vczh ? 1:字符集 ? ? 字符集是正则表达式最基本的元素,因此反映到状态图上,字符集也会是构成状态图的基本元素.对于字符集C,如果有一个规则只接受C的话,这个规则对应的状态图将会被构造成以下形式: ? ? ? ? 这个状态图的初始状态是Start,结束状态是End.Start状态读入字符集C跳转到End状态,不接受其他字符集. ? ? 2:串联 ? ? 如果我们使用A⊙B表示规则A和规则B的串联,我们可以很容易的知道串联这个操作具有结合性,也就是说(A⊙B)⊙C=A⊙(B⊙C).因

编译原理-第三章 词法分析-3.7 从正则表达式到自动机-从正则表达式构造NFA

基于MYT算法从正则表达式构造NFA 基本思想: 性质: 对于加括号的正则式(s),使用N(s)本身作为它的NFA 一.构造识别ε和字母表中一个符号的NFA 1.特点 仅一个接受状态,它没有向外的转换 2.示例 二.构造识别主算符为选择正则式的NFA 1.特点 仅一个接受状态,它没有向外的转换 2.示例 三.构造识别主算符为连接正则式的NFA 1.特点 仅一个接受状态,它没有向外的转换 2.示例 四.构造识别主算符为闭包正则式的NFA 1.特点 仅一个接受状态,它没有向外的转换 2.示例 五.例

NFA->DFA->最简DFA

/** *author Young * *2014-5-11 * */ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.LinkedList; import jav

如何将 不确定的有穷自动机(NFA) 转化为 确定的有穷自动机(DFA)

一.从NFA到DFA的转换 例如下图: DFA的每个状态都是一个由NFA中的状态构成的集合,即NFA状态集合的一个子集 r =aa*bb*cc* 二.从带有ε-边的NFA到DFA的转换 r=0*1*2* 三.子集构造法( subset construction) ? 输入:NFA N? 输出:接收同样语言的DFA D? 方法:一开始,ε-closure ( s0 )是Dstates 中的唯一状态,且它未加标记: while(在Dstates中有一个未标记状态T ) { 给T加上标记: for(每

js分解url参数(正则表达式,split比较)(面向对象-极简主义法应用)

一:正则表达式法 <script type="text/javascript"> function getQueryString(url) { if(url) { url=url.substr(url.indexOf("?")+1); //字符串截取,比我之前的split()方法效率高 } var result = {}, //创建一个对象,用于存name,和value queryString =url || location.search.substr

实况:《编译原理》期末考试一天复习

大学的编译原理课程是讲解如何设计编译器的.我要做的,是在一学期没怎么听课的条件下,用我对算法的理解能力,和互联网以及身边同学的帮助,来在不足一天的时间中复习完考试所需的所有知识. 我手上有两份可用资料: 复习课上记录的,老师对考试知识点的回顾. 同学总结的,会考的算法的列表. 而现在的时间是晚上6:33,我刚刚看完大约四分之一,明天下午1:10就考试了.由于时间紧迫,我必须对自己的任务有个计划,不能浪费一点时间.这个计划会花去我大概半个小时的时间,但它是一定要做的,否则我一定复习不完. 考试涉及

实现一个 DFA 正则表达式引擎 - 3. NFA 的确定化

我们上一节已经将 NFA 构建出来了,我们的 NFAState 对象的结构实际上是这样的: NFAState { private Set<NFAState> directTable; private Map<Character, Set<NFAState>> transitionMap; private int id; } 其中 transitionMap 是该状态接受 Character 后可以转换的状态的映射表. 那么以初始状态 0 为例,我们是不是可以认为状态 0