(然而并没有看懂,只是转下这种高深莫测的东西)
https://www.jianshu.com/p/361de32e432d
DFA构成:五元组(K,∑,f,S,Z)
K:所有状态的集合
∑:所有可接受的输入符号的集合
f:转换函数,是K × ∑ → K 上的映射。就是一个状态读入某个输入符号之后所到达的下一个状态的规则
S:K中的初始状态(只有一个)
Z:K中的终态集合(多个)
NFA构成:五元组
K:所有状态的集合
∑:所有可接受的输入符号的集合
f:转换函数,是K × ∑* → 2^k 上的映射(2^k表示k的幂级)。就是一个状态读入某个输入符号之后,可能达到多个状态
S:K中的初始状态集合(多个)
Z:K中的终态集合(多个)
例子
DFA M = ({S,U,V,Q},{a,b},f,S,{Q}),其中f定义为
f(S,a) = U, f(U,a) = Q, f(V,a) = U, f(Q,a) = Q,
f(S,b) = V, f(U,b) = V, f(V,b) = Q, f(Q,b) = Q
状态图
初态:以箭头指向表示
终态:以双圆圈表示
状态转换:以有向弧表示
微信公众号:JavaWeb架构师
状态转换表(矩阵表示)
(横,纵) → 值:(当前状态,输入符号) → 下一状态
右侧0/1:0表示非终态,1表示终态
状态\符号 |
a |
b |
|
S |
U |
V |
0 |
U |
Q |
V |
0 |
V |
U |
Q |
0 |
Q |
Q |
Q |
1 |
ε-closure(I):其中I是一个集合。表示I中每个状态经过任意条ε弧后,所能达到的状态的集合。
move(I,a):其中I是一个集合,a是一条弧。表示I中每个状态经过一条a弧后,所能达到的状态的集合。
例子
微信公众号
A = ε-closure(0) = {0,1,2,4,7}
move(A,a) = {3,8}
这里介绍 子集法,假设NFA N = (K,∑,f,K0,Kt),构造一个等价DFA M = (S,∑,D,S0,St)
步骤
1) 计算ε-closure(K0),取名T0
2)标记T0以处理,分别计算ε-closure(move(T0,∑的单个输入),取名Tx……Ty
3)标记已处理,对新的Tx-Ty重复第二步,直到不再产生新的Ti集合为止
4)按照1、2、3步的关系,确定所有的T集合之间的转换关系
5)S0=[T0],St=含有NFA中的终态的那个T集合
6)画出状态图
例子
微信公众号
计算ε-closure(K0),取名T0,K0只有一个0状态
T0 = ε-closure(0) = {0,1,2,4,7}
分别计算ε-closure(move(T0,∑的单个输入),取名Tx……Ty
----------------------------------------------T0------------------------------------------------
Ti = ε-closure(move(T0,a))
move(T0,a) = {3,8}
T1 = {1,2,3,4,6,7,8}
Ti = ε-closure(move(T0,b))
move(T0,b) = {5}
T2 = {1,2,4,5,6,7}
对新的Tx-Ty重复第二步,直到不再产生新的Ti集合为止(T1、T2)
----------------------------------------------T1------------------------------------------------
T1 = {1,2,3,4,6,7,8}
Ti = ε-closure(move(T1,a))
move(T1,a) = {3,8}
Ti = T1
Ti = ε-closure(move(T1,b))
move(T1,b) = {5,9}
T3 = {1,2,4,5,6,7,9}
----------------------------------------------T2------------------------------------------------
T2 = {1,2,4,5,6,7}
Ti = ε-closure(move(T2,a))
move(T2,a) = {3,8}
Ti = T1
Ti = ε-closure(move(T2,b))
move(T2,b) = {5}
Ti = T2
----------------------------------------------T3------------------------------------------------
T3 = {1,2,4,5,6,7,9}
Ti = ε-closure(move(T3,a))
move(T3,a) = {3,8}
Ti = T1
Ti = ε-closure(move(T3,b))
move(T3,b) = {5,10}
T4 = {1,2,4,5,6,7,10}
----------------------------------------------T4------------------------------------------------
T4 = {1,2,4,5,6,7,10}
Ti = ε-closure(move(T4,a))
move(T4,a) = {3,8}
Ti = T1
Ti = ε-closure(move(T4,b))
move(T4,b) = {5}
Ti = T2
至此,所有状态求解已经完成
S = {T0,T1,T2,T3,T4}
S0 = T0
St = T4(T4中含有10)
∑ = {a,b} (和NFA是一样的)
D
D(T0,a) = T1D(T0,b) = T2D(T1,a) = T1D(T1,b) = T3D(T2,a) = T1D(T2,b) = T2D(T3,a) = T1D(T3,b) = T4D(T4,a) = T1D(T4,b) = T2
将T0,T1,T2,T3,T4分别对应到0,1,2,3,4,得到状态转换图如下所示