NFA确定化算法
概念:
子集法
- 核心算法
– 子集法例子:
构造NFA:
① 首先计算ε-closure(0),令T0=ε-closure(0)={0,1,2,4,7},T0未被标记,它现在是子集族C的唯一成员。
② 标记T0;令T1=ε-closure(move(T0,a))={1,2,3,4,6,7,8},将T1加入C中,T1未被标记。
令T2=ε-closure(move (T0,b))={1,2,4,5,6,7},将T2加入C中,它未被标记。
③ 标记T1;计算ε-closure(move(T1,a)),结果为{1,2,3,4,6,7,8},即T1,T1已在C中。
计算ε-closure(move(T1,b)),结果为{1,2,4,5,6,7,9},令其为T3,T3加至C中,它未被标记。
④ 标记T2,计算ε-closure(move(T2,a)),结果为{1,2,3,4,6,7,8},即T1,T1已在C中。
计算ε-closure(move(T2,b)),结果为{1,2,4,5,6,7},即T2,T2已在C中。
⑤ 标记T3,计算ε-closure(move(T3,a)),结果为{1,2,3,4,6,7,8},即T1。
计算ε-closure(move(T3,b)),结果为{1,2,4,5,6,7,10},令其为T4,加入C中,T4未被标记。
⑥ 标记T4,计算ε-closure(move(T4,a)),结果为{1,2,3,4,6,7,8},即T1
计算ε-closure(move(T4,b))结果为{1,2,4,5,6,7},即T2。
至此,算法终止共构造了五个子集:
T0={0,1,2,4,7}
T1={1,2,3,4,6,7,8}
T2={1,2,4,5,6,7}
T3={1,2,4,5,6,7,9}
T4={1,2,4,5,6,7,10}
那么图4.4的NFA N构造的DFA M为
① S={[T0],[T1],[T2],[T3],[T4]}
② Σ={a,b}
③ D([T0],a)=[T1] D([T2],a)=[T1]
D([T0],b)=[T2] D([T2],b)=[T2]
D([T1],a)=[T1] D([T3],a)=[T1]
D([T1],b)=[T3] D([T3],b)=[T4]
D([T4],a)=[T1]
D([T4],b)=[T2]
④ S0=[T0]
⑤ St=[T4]
不妨将[T0],[T1],[T2],[T3],[T4]重新命名,以利于书写,或用A,B,C,D,E或用0,1,2,3,4分别表示。若采用后者,该DFA M的状态转换图如下图所示
= 例子
确定有穷自动机的化简
定义1 多余状态:从开始状态出发,任何输入串也不能到达的状态
定义2 等价状态:状态s和t的等价条件是:
① 状态S和T必须同时为终态或非终态
② 对于所有输入符号,S和T必须转换到等价的状态里
化简方法:
(1)将K划分为终态集和非终态集,得K’={Z,K-Z}。
(2)递归地分割K’中的子集,使得任何两个不同子集的状态都是可区分的,而同一个子集中的状态都是等价的。
(3)K’中的每个子集合并为一个状态。
(4)含原初态的状态为初态;含原终态的状态为终态。
DFA最小化是指将一个确定性有限状态自动机(DFA)转换成具有最少状态数的等价DFA的过程。这个过程可以通过以下步骤完成:
1.为DFA构建状态转移表。
2.标记状态对(P,Q),其中P∈F,Q∉F(F是DFA的接受状态集合)。
3.对于每个标记为(P,Q)的状态对,将其标记为(Q,P)。
4.对于未标记的状态对(P,Q),找到输入符号a,使得δ(P,a)=X,δ(Q,a)=Y,且(X,Y)已标记。然后标记(P,Q)。
5.重复步骤4,直到不能再标记任何新的状态对为止。
6.将所有未被标记的状态对(P,Q)合并成一个状态,新的状态转移函数为:δ([P],[Q])=δ(P,a)=[Q],其中a是任何输入符号。
合并后的状态集合就是最小化DFA的状态集合。