本文主要内容为FA分类,DFA、NFA、正则表达式之间的相互转换。
有穷自动机(finite automata)
FA的表示
- 结点:FA的状态
- 1 初始状态(开始状态):只有一个,由start箭头指向
- 2 终止状态(接收状态):可以有多个,用双圈表示
- 带标记的有向边:如果对于输入a,存在一个从状态p到状态q的转换,就在p、 q之间画一条有向边,并标记上a
FA定义(接收)的语言
- 给定输入串x, 如果存在一个对应于串x的从初始状态到某个终止状态的转换序列,则称串x被该FA接收
- 由一个有穷自动机M接收的所有串构成的集合称为是该FA定义(或接收)的语言,记为L(M )
最长子串匹配原则
FA的分类
本质上是与状态转化图类似的图,有穷(有限)自动机判别输入串的类型;NFA(Nondeterministic Finite Automata)和DFA(Deterministic Finite Automata)。
NFA对其边上的标号没有任何限制,一个符号标记离开同一状态的多条边,并且空串也可以作为标号。DFA对于每个状态和自动机输入字母表中的每个符号,有且只有一条离开该状态,以该符号为标号的边。
确定的有穷自动机DFA
DFA是NFA的一个特例,其中:
- 没有输入 $\varepsilon$ 上的转换动作
- 对每个状态 s 和每个输入符号 a ,有且只有一条标号为 a 的边离开 s 。
接受(a|b)*abb的DFA
不确定的有穷自动机NFA
正则式(a|b)*abb表达的语言NFA:
NFA由以下几个部分组成:
- 有穷的状态集合S。
- 输入集合符号 $\sum$ ,也即输入字母表,假设代表空串的 $\varepsilon$ 不是 $\sum$ 中的元素。
- 转换函数(transition function),为每个状态和 $\sum$ $\bigcup$ {$\varepsilon$} 中的每个符号都给出了相应的后继状态(next state)的集合。
- S 中的一个状态 s_{0} 被指定为开始状态,或者是初始状态。
- S 中的一个子集 F 被指定为接受状态(或者说终止状态)的集合。
不管是NFA还是DFA,都可以表示为一张转换图(transition graph)。
上图可以使用下面的转换表表示:
等价性
DFA NFA的等价性
带有和不带有“ε-边”的NFA 的等价性
正则表达式和NFA(DFA)的转换
从RE到FA
根据RE构造NFA
举例:RE到NFA转换
NFA和DFA的转换
子集构造法
➢ 输入: NFA N
➢ 输出:接收同样语言的DFA D
➢ 方法: 一开始, ε-closure(s0 )是Dstates 中的唯一状态,且它未加标记;
while(在Dstates中有一个未标记状态T ){
给T加上标记;
for(每个输入符号a){
U = ε-closure(move(T, a));
if ( U不在Dstates中)
将U加入到Dstates中,且不加标记;
Dtran[T, a]=U ;
}
}
计算 ε-closure (T )
将T的所有状态压入stack中;
将ε-closure(T )初始化为 T ;
while(stack非空){
将栈顶元素 t 给弹出栈中;
for(每个满足如下条件的u :从t出发有一个标号为ε的转换到达状态u)
if ( u不在ε-closure(T )中){
将u加入到ε-closure(T )中;
将u压入栈中;
}
}