编程语言
首页 > 编程语言> > 【编译原理】DFA最小化算法

【编译原理】DFA最小化算法

作者:互联网

【编译原理】DFA最小化算法

DFA的定义

DFA是Determinant Finite Automata,确定性有穷自动机这个定义有几个关键点

数学地来说:DFA是一个五元组,包括\((S,state,\Sigma,Mov,T)\):初始状态,状态,字符集,状态转移函数,结束状态。

对于OIer的快速入门:一个AC自动机/SAM就是一个DFA,一个\(state\)可以对应成图上的一个节点,\(\Sigma\)就是AC自动机/SAM的字符集,\(S\)就是AC自动机/SAM的开始节点,\(T\)就是接受节点,而\(Mov(A,b)=C\)就是查询\(A\)走一条字符为\(b\)的边到了哪个节点(\(C\)),如果没有这条边那么\((A,b)\)没有不在\(Mov\)函数的定义域。

最小DFA定义

可接受字符串集合相同的DFA称为等价DFA,最小DFA的定义是所有等价DFA中节点最小的,可以证明节点最小的DFA只有一种。

状态(也就是DFA的某个节点)的可区分性

两个点不可区分记为\(A\sim B\)

\(A\sim B\),A和B不可区分当且仅当两个状态的所有出边都对应不可区分

所有出边对应不可区分当且仅当\(\not \exists c\in \Sigma , Mov(A,c)\not \sim Mov(B,c)\),即符号对应的出边到达的节点不可区分

倍增法求最小化DFA

初始情况,我们能确定,至少所有结束状态和其他节点(非结束状态)是不一样的。

算法的思路是不断寻找可区分的点,并且分裂,层次有点类似B算法求最小生成树。

使用合适的数据结构可以做到\(O(m \log m)\)

代码到时候再说吧。

这个算法的发明者最终获得了图灵奖!

标签:区分,Mov,编译,集合,最小化,prod,DFA,节点
来源: https://www.cnblogs.com/winlere/p/16115073.html