编译原理词法分析之NFA与自动机的最小化

非确定有限自动机的定义:

非确定有限自动机是一NFA是一个五元组( S, S0, f, Z,其中

  • 是一个有穷字母表,它的每个元素称为一个输入字符
  • S是状态集合
  • S0是初始状态的集合,是非确定有限自动机的初始状态集合
  • f:是一个从S X {e})到S的子集的映射,S×(å{e})2s
  • ZÍS   是一个终止状态集合。又称为接收状态集合

 

DFANFA的区别:

1 一个状态的不同输出便可以标有相同的符号

2 允许有多个开始状态

3 允许有空边

 

NFA所能接受的串定义与DFA保持一致。

a

e                                               ab   

0

1                       a

2

b

 

    很明显,在如果我们使用NFA来表述问题,因为我们引入了空边,并且能够有多个开始状态,这使得我们在描述问题时非常方便,可这又引入了另外的问题,那就是实现的问题。因为对于一个状态,之前我们在学习DFA的时候可以很方便的实现是因为,一个状态输入一个输入字符,可以确定的进入另一个状态,而NFA不然,对于一个状态,你进入一个输入字符,你无法确定下一个状态是什么,而且初始状态有多个,我们对问题的初始状态应该赋值为哪一个,我们都没法确定。因此,NFA在表述问题方面,很方便,但在实现方面远远没有DFA便捷。

 

自动机等价问题:

对于任何一个非确定有限自动机,存在一个确定自动机与之对应,两者接收的符号串一致,系两者等价。

 

NFADFA的转换

状态集e 闭包

INFA M状态集和的自己,定义I的空闭包e -CLOSURE(I)为:

  1. q属于I,则q属于这个空闭包
  2. q属于I,那么从q出发经任意条空弧而能到达的任何状态q‘都属于这个空闭包。

 

状态集Ia转换:若I = {S1, S2, S3, ……, Sm}NFA的状态集的一个自己,a属于字母表,则定义:

Ia = e -CLOSURE(J)

其中Jf(S1, a) f(S2, a)f(S3, a)……f(sm, a)

也就是从I集合S1, S2, S3, ……, Sm接收一个a所能达到的状态总和为J

 

已知ANFA,构造A‘:DFA

 

  1. A'的初始状态为
    I0 =  e -CLOSURE({S1, S2, S3, ……, Sk}),其中S1,……,SkA的全部初始状态
  2. I={S1, S2, S3, ……, Sm}A'的一个状态,a属于字母表,则定义f‘(I, a = Ia,将Ia加入S’,重复该过程,直到S‘不产生新的状态
  3. I =  {S1, S2, S3, ……, Sn}A’的一个状态,且存在一个SiA的终止状态,则令I'A‘的终止状态。

 

 

计算机生成了可选文字:

 

 

 

 

根据构造算法:

确定DFA的初始状态A'

在上图中,只有一个初始状态1,(箭头指向为初始状态)

计算初始状态集合的空闭包,因为初始状态集合只有一个元素,1

DFA的初始状态也就是NFA初始状态集合的空闭包。

空闭包的定义为包含当前元素q,也包括从当前元素到达的元素。也就是说对应的DFA中的初始状态为{1 2}(其中21经过空边所到的状态)

2,也就是说第一个DFA的状态我们已经确定,I = {1 2},又因为上图中只有两个输入符号{a, b}(空不算)(字母表中的所有元素)下面分别计算IaIb就能确定从DFA初始状态所能到达的两个状态了。

Ia

先确定J

J = f(S1, a) f(S2, a)f(S3, a)……f(sm, a)。也就是I中所有状态这里为{1 2}中的1状态和2状态,经过字符a所能到达的状态的并集。这样的话J就能确定为J = {4 5}

之后确定{4 5}的空闭包(也就是Ia),就确定了一个DFA中的状态。

{4 5}的空闭包首先包括4 5,然后包括从4 5出发经过空边到达的状态从4经过空边到达75经过空边到达67没有空边的输出边,6经过输出空边到2状态。2没有输出空边。也就是我们已经确定了Ia = {4 57  6 2 },这便是DFA的另外一个状态。

Ib

同理:可确定Ib

Ib = {3, 8};

因为字母表只有两个字符,所以最多确定两个状态集合。也就是说现在DFA中的状态我们已经确定了三个。

{1 2} {4 5 6 7 8} {3 8}

接下来依次类推即可。

 

画出DFA时只需要做出对应即可。

 

 

计算机生成了可选文字:

 

 

 

 

 

计算机生成了可选文字:
,转化后的结果
{1,2}对应1
【2,4,5,6,71对应2
{3,8}对应3
{3,8,91对应4一健
{9}对应5
}}一

 

 

 

 

 

 

另一种消除空边的方式:

 

 

0                                                  1           a                                2

 

 

 

 

        0                                                           1                      a                     2   

 

 

 

a

 

空边出现环路的时候,就把这几个状态合为一个。

 

 

自动机的最小化

等价状态:

DFA的两个状态S1S2,如果对任意输入的符号串x,从S1S2出发,总是同时到达接收状态或者拒绝状态中,则称两者等价。

 

 

无关状态:

                                                                                                                             2

                                                                                  0

 

 

 

 

                                                                                                    1

 

 

 

0                                                                     2

 

 

     

 

 

 

 

 

两个1都是无关状态

 

 

自动机的最小化:

最小自动机:

如果DFA M中没有无关状态,也没有等价状态,则称M为最小自动机

 

结论:任意一个DFA都可以化为最小自动机,并且两者接收相同的符号串。

自动机的化简

 

状态分离法:

  1. 终止状态为1组,非终止状态为1
  2. 对每一组进行分离,若每一组中的元素映射到不同的组,则表示他们不等价,就可以划分出来
  3. 重复2,直到没有新组产生,此时每组中的状态都为等价状态。

 

 

计算机生成了可选文字:
贫
乡叫罗尸
一必
、\
}丘
二~
:七_二

 

 

 

屏幕剪辑的捕获时间: 2015/3/22 18:59

 

自动机的最简化,是针对DFA的,不要弄混乱了

 

显然,第一步是把组分开分为两组{12 3 5} {4 6 7 8}

2 分离第一组{1 2 3 5}

1经过a到自身,经过b自身

2经过a没有了,经过b到另外一组({4 6 7 8}

3 经过a到自身,经过b到自身

5经过a到没有了,经过b到另外一组({4 6 7 8}

 

这样的话也就分离开了,13一组,25一组也就是

{1 2 3 5}经过这一步分离为{1 3}{2 5}

分离第二组{4 6 7 8}

4经过a{2 5},经过b到自身

6经过a{2 5} 经过b到自身

7经过a{2 5} 经过b到自身

8经过a{2 5} 经过b到自身

 

因为四个状态对于任意的输入符号总是同时到达一样的状态,因此我们现在说这个{46  7 8}暂时不 分。

现在一共有3组,{1 3} {2 5} {4 6 7 8}

 

3,重复2

分离第一组{1 3}

1经过a{2 5} 经过b到自身

3经过a{2 5} 经过b到自身

 

因为第一组中所有状态对于字母表中任意输入符号串总是到达一样的状态,因此他们等价,不划分

分离第二组{2 5}

第二组不用划分

分离第三组{4 6 7 8}

第三组不用划分,已经等价。

 

因为这一次没有新组产生,则我们可以得出结论,此时每一组中的状态都为等价状态。相应的画出DFG即可。

 

 

 

 

 

 

 

 

 

 

                                                                                                    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值