正规式->最小化DFA说明

 今天早上去图书馆,去看编译原理,想把这部分搞清楚,看着龙书+国产的某一本不知什么的习题与解析,猜过程。。猜原理。。终于是看懂了。。
整体的步骤是三步:
一,先把正规式转换为NFA(非确定有穷自动机),
二,在把NFA通过“子集构造法”转化为DFA,
三,在把DFA通过“分割法”进行最小化。

   一步很简单,就是反复运用下图的规则,图1

  这样就能转换到NFA了。
给出一个例题,来自Google book。本文主要根据这个例题来讲,图2

   二.子集构造法。
同样的例题,把转换好的NFA确定化,图3

  这个表是从NFA到DFA的时候必须要用到的。第一列第一行I的意思是从NFA的起始节点经过任意个ε所能到达的结点集合。Ia表示从该集合开始经过一个a所能到达的集合,经过一个a的意思是可以略过前后的ε。同样Ib也就是经过一个b,可以略过前后任意个ε。
至于第二行以及后面的I是怎么确定的。我参考了一些题目才明白,原来就是看上面的Ia和Ib哪个还没出现在I列,就拿下来进行运算,该列对应的Ia和Ib就是前面我说的那样推导。

  如果还不太明白,看图就是了。你会发现I中的几个项目都在Ia和Ib中出现了。而且是完全出现

  这步做完以后,为了画出最后的DFA,那么肯定得标出一些号来,比如1.2.3.。或者A。 B。c,我一般标的方法是先把I列全部标上1.2.3.递增。然后看1表示的集合和Ia和Ib中的哪个集合一样,就把那个集合也表示为1.继续向下做。最后会得到这样一个表格。图4

  至此,就可以表示出DFA了。就对照上面那个表,从0节点开始经过a到1.经过b到2,就这样画就行了。。

  最后的DFA如下图,图5

  双圈的表示终态,这个是怎么来的呢。去看看图4,会发现有些项之前有双圈标志,这个是因为在NFA图2中,9为终态,所以所有包含9的集合都被认为是终态集,改成1.2.3.。。方便画节点后就需要把这些点作为终态了。。

   三.最小化,分割法。

FA的最小化就是寻求最小状态DFA

  最小状态DFA的含义:
1.没有多余状态(死状态)2. 没有两个状态是互相等价(不可区别)
两个状态s和t等价的条件:
兼容性(一致性)条件——同是终态或同是非终态
传播性(蔓延性)条件——从s出发读入某个a和从t出发经过某个a并且经过某个b到达的状态等价。就是相同。

  DFA的最小化—例子,第一步都是固定的。分成终态和非终态

1.将M的状态分为两个子集一个由终态k1={C,D,E,F}组成,一个由非终态k2={S,A,B}组成,

2.考察{S,A,B}是否可分.

因为A经过a到达C属于k1.而S经过a到达A属于k2.B经过a到达A属于k2,所以K2继续划分为{S,B},{A},

3.考察{S,B}是否可再分:

B经过b到达D属于k1.S经过b到达B属于k2,所以S,B可以划分。划分为{S},{B}

4.考察{C,D,E,F}是否可再分:
因为C,D,E,F经过a和b到达的状态都属于{C,D,E,F}=k1所以相同,所以不可再分:

5.{C,D,E,F}以{D}来代替则,因为CDEF相同,你也可以用C来代替。无所谓的最小化的DFA如图,:

真麻烦啊。。心里清楚,还得找些图来说明。。额。。基本上感觉自己讲清楚了。。。不清楚的地方。。请留言互相讨论。。谢谢。。

参考:

http://www.worldcat.org/title/bian-yi-yuan-li-xue-xi-fu-dao/oclc/302301738

http://metc.gdut.edu.cn/compile/cmpl3/3-3.htm

### 正则表达到确定性有限状态自动机(DFA)的转换方法 将正则表达转化为确定性有限状态自动机(DFA)的过程可以分为几个阶段,这些阶段涉及多个理论计算机科学中的经典算法和技术。以下是详细的描述: #### 1. **正则表达到非确定性有限状态自动机(NFA)** 使用 Thompson 构造法,可以从最基础的单字符匹配逐步构建复杂的正则表达的 NFA 表示形[^4]。此过程中,基本的操作包括串联、并联以及闭包运算。 - 对于单一字符 `a`,其对应的 NFA 是一个简单的两状态结构,其中有一个从起始状态到终止状态的转移路径,标记为字符 `a`。 - 如果有复合表达如 `ab` (即两个字符的序列),那么会先单独创建每个字符的 NFA 图形,之后通过 ε-移动将其顺序链接在一起。 - 当遇到逻辑或操作符 `|` 时,则需引入新的起点和终点节点,并利用 ε-过渡来连接原始各部分的 NFAs 至新端点。 #### 2. **非确定性有限状态自动机(NFA)至确定性有限状态自动机(DFA)** 接下来采用子集构造算法把上述得到的 NFA 转换成等价但更易于实现模拟运行行为模识别任务所需的 DFA 形态[^2]。具体做法如下所示: - 初始化一个新的空集合作为当前活动状态列表;如果存在任何可到达的状态都应加入进来形成初始超级状态- 针对该超级状态下每一个可能输入符号计算下一步可达的所有目标位置组合而成的新超级状态; 并记录下它们之间的映射关系直至遍历完整个空间为止; - 每当发现尚未处理过的全新超级状态就重复执行以上步骤直到不再新增未访问过的情况发生. #### 3. **优化最终获得的 DFA** 为了提升性能表现还可以进一步简化所生成出来的 DFA 结构使其体积变得更紧凑从而提高查询速度效率等方面考虑应用霍普克罗夫特最小化算法[Hopcroft Minimization Algorithm][^2]. 它能够有效地减少冗余状态数量使得整体设计更加简洁高效. ```python def regex_to_dfa(regex): # Step 1: Convert Regex to NFA using Thompson's Construction Method. nfa = thompson_construction(regex) # Step 2: Transform the constructed NFA into an equivalent DFA via Subset Construction Technique. dfa = subset_construction(nfa) # Optional Step 3: Optimize the resulting DFA by applying Hopcroft’s minimization algorithm. minimized_dfa = hopcroft_minimization(dfa) return minimized_dfa ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值