非确定有限自动机的定义:
非确定有限自动机是一NFA是一个五元组(∑, S, S0, f, Z),其中
- ∑是一个有穷字母表,它的每个元素称为一个输入字符
- S是状态集合
- S0是初始状态的集合,是非确定有限自动机的初始状态集合
- f:是一个从S X (∑ ∪{e})到S的子集的映射,S×(å∪{e})→2s
- ZÍS 是一个终止状态集合。又称为接收状态集合
DFA与NFA的区别:
1, 一个状态的不同输出便可以标有相同的符号
2, 允许有多个开始状态
3, 允许有空边
NFA所能接受的串定义与DFA保持一致。
a
e a,b
0
1 a
2
b
很明显,在如果我们使用NFA来表述问题,因为我们引入了空边,并且能够有多个开始状态,这使得我们在描述问题时非常方便,可这又引入了另外的问题,那就是实现的问题。因为对于一个状态,之前我们在学习DFA的时候可以很方便的实现是因为,一个状态输入一个输入字符,可以确定的进入另一个状态,而NFA不然,对于一个状态,你进入一个输入字符,你无法确定下一个状态是什么,而且初始状态有多个,我们对问题的初始状态应该赋值为哪一个,我们都没法确定。因此,NFA在表述问题方面,很方便,但在实现方面远远没有DFA便捷。
自动机等价问题:
对于任何一个非确定有限自动机,存在一个确定自动机与之对应,两者接收的符号串一致,系两者等价。
NFA到DFA的转换
状态集e 闭包:
设I是NFA M状态集和的自己,定义I的空闭包e -CLOSURE(I)为:
- 若q属于I,则q属于这个空闭包
- 若q属于I,那么从q出发经任意条空弧而能到达的任何状态q‘都属于这个空闭包。
状态集I的a转换:若I = {S1, S2, S3, ……, Sm}是NFA的状态集的一个自己,a属于字母表∑,则定义:
Ia = e -CLOSURE(J)
其中J为f(S1, a) ∪f(S2, a)∪f(S3, a)∪……∪f(sm, a)
也就是从I集合S1, S2, S3, ……, Sm接收一个a所能达到的状态总和为J
已知A:NFA,构造A‘:DFA
- 令A'的初始状态为
I0‘ = e -CLOSURE({S1, S2, S3, ……, Sk}),其中S1,……,Sk是A的全部初始状态 - 若I={S1, S2, S3, ……, Sm}是A'的一个状态,a属于字母表∑,则定义f‘(I, a) = Ia,将Ia加入S’,重复该过程,直到S‘不产生新的状态
- 若I‘ = {S1, S2, S3, ……, Sn}是A’的一个状态,且存在一个Si是A的终止状态,则令I'为A‘的终止状态。
根据构造算法:
确定DFA的初始状态A'
在上图中,只有一个初始状态1,(箭头指向为初始状态)
计算初始状态集合的空闭包,因为初始状态集合只有一个元素,1,
DFA的初始状态也就是NFA初始状态集合的空闭包。
空闭包的定义为包含当前元素q,也包括从当前元素到达的元素。也就是说对应的DFA中的初始状态为{1, 2}(其中2为1经过空边所到的状态)
2,也就是说第一个DFA的状态我们已经确定,I = {1, 2},又因为上图中只有两个输入符号{a, b}(空不算)(字母表中的所有元素)下面分别计算Ia和Ib就能确定从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经过空边到达7,5经过空边到达6,7没有空边的输出边,6经过输出空边到2状态。2没有输出空边。也就是我们已经确定了Ia = {4, 5,7, 6, 2, },这便是DFA的另外一个状态。
Ib
同理:可确定Ib
Ib = {3, 8};
因为字母表只有两个字符,所以最多确定两个状态集合。也就是说现在DFA中的状态我们已经确定了三个。
{1, 2}, {4, 5, 6, 7, 8}, {3, 8}
接下来依次类推即可。
画出DFA时只需要做出对应即可。
另一种消除空边的方式:
0 空 1 a 2
0 1 a 2
a
空边出现环路的时候,就把这几个状态合为一个。
自动机的最小化
等价状态:
设DFA的两个状态S1,S2,如果对任意输入的符号串x,从S1和S2出发,总是同时到达接收状态或者拒绝状态中,则称两者等价。
无关状态:
2
0
1
0 2
两个1都是无关状态
自动机的最小化:
最小自动机:
如果DFA M中没有无关状态,也没有等价状态,则称M为最小自动机
结论:任意一个DFA都可以化为最小自动机,并且两者接收相同的符号串。
自动机的化简
状态分离法:
- 终止状态为1组,非终止状态为1组
- 对每一组进行分离,若每一组中的元素映射到不同的组,则表示他们不等价,就可以划分出来
- 重复2,直到没有新组产生,此时每组中的状态都为等价状态。
屏幕剪辑的捕获时间: 2015/3/22 18:59
自动机的最简化,是针对DFA的,不要弄混乱了
显然,第一步是把组分开分为两组{1,2, 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})
这样的话也就分离开了,1和3一组,2和5一组也就是
{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到自身
因为四个状态对于任意的输入符号总是同时到达一样的状态,因此我们现在说这个{4,6, 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即可。