编译原理的有限自动机

语言的识别器是一个程序,它取串x作为输入,当x是语言的句子时,它回答“是”,否则回答“否”。

可以通过构造 称为有限自动机更一般转换图,把正规式翻译成识别器

有限机分 确定的 和 不确定的 两种情况。“不确定”指的是,存在这样的状态,对于某个输入符号,它存在不止一种转换。

确定的和不确定的有限自动机都能识别正规集。但是他们之间存在时空权衡问题,从确定的有限自动机比不确定的有限自动机得到的识别器要快得多。但是确定的有限自动机比等价的不确定的有限自动机占用更多的空间。

不确定的有限自动机(Non-deterministic Finite Automata, NFA)

NFA是一个数学模型,它包括:

1)一个有限的状态集合S

2)一个输入符号的集合\sum(空串不出现在其中)

3)一个转换函数move 它把状态和符号两元组映射到一个状态集合

4)状态s0是唯一的开始状态

5)状态集合F是接受(或终止)状态集合,F\tiny \subseteqS

确定的有限自动机(Deterministic Finite Automata, DFA)

1)任何状态下都没有空串的转换

2)对任何状态s 和 任何输入符号a,最多只有一条标记为a的边离开s,

即转换函数move:S×\tiny \sum\small \rightarrowS 可以是一个部分函数,这边不是P(S),只能是S(表示一个确定的状态),部分函数的意思是对于某个状态并不是对\tiny \sum里的所有符号都有转换。

从NFA到DFA的变换

子集构造法

1)NFA(不确定有限自动机)的一个状态  是 DFA的 一个状态集合

算法 从NFA到DFA的子集构造法

输入 一个NFA N

输出 一个接受同样语言的DFA D

方法 为D构造转换表,表中的每个状态是N中的状态的集合,D“并行”地模拟 N面对输入串的所有可能的移动。

简单说就是将NFA中的状态进行合并成为DFA中的新状态。

在NFA有以下几种运算来将其构造成DFA

\small \varepsilon-closure(s)  求的是从NFA的状态s出发,通过空串转换能到达的NFA状态的集合(求出的是集合 状态可能是多个)

\small \varepsilon-closure(T) 这个运算建立在\small \varepsilon-closure(s) 的基础上,T是NFA的一个状态集合,对里面的每个状态求\small \varepsilon-closure(s) ,再将求出的结果合并(求并集)。

move(T,a)  从集合T中的任意一个状态通过输入符号a能转换到的状态的并集。

因为允许空串转换,看见a后,N可以处于 \small \varepsilon-closure(move(T,a))的任何一个状态中。

 所以从N的开始状态s0通过a能到达的集合为 \small \varepsilon-closure(move(\small \varepsilon-closure(s0),a))

DFA的化简

(理论上)每一个正规集都存在一个状态数最少的DFA识别 

原理:基于转换函数是全函数

算法 极小化DFA的状态数

输入 一个DFA M,它的状态集合是S,输入符号集合是\tiny \sum,转换函数是move:S × \tiny \sum \small \rightarrow S

开始状态是s0。接受状态是集合是F。

输出 一个DFA M`,它和M接受同样的语言,且状态数最少。

算法过程

1) 将状态集合分为两个子集,接受状态集合F和 非接受状态集合S-F.

2) 构造新的划分,对 每个子集G进行新的划分,当且仅当对任意输入符号a,状态s和t转换到同一子集中,G的两个状态s和t在同一子集中。

用新划分的子集替代之前的被划分的子集。

3)如果有划分的可能则继续执行2)

4)在最后的划分中选中一个状态子集代表最简DFA 的 M`的一个状态

5) 如果有死状态则去掉它

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值