加深对DFA工做原理的理解。
java
什么是FA,也叫有穷状态自动机;书上是这么说的👇,是一个五元组(状态集合,字母表,状态转移表,开始状态,终止状态集合)
什么是DFA,也是一个五元组,在FA的基础上加了一个约束条件:每个状态结点只能发出一条具备相同符号的边;也就是同一状态不能发出(输入字符相同的)两条边上。能够发出输入字符不一样的多条边
下图就是一个DFA栗子👇编程
下图就是NFA的栗子👇(容许从一个状态发出多条具备相同符号的边,甚至容许发出标有ε(表示空)符号的边)
数据结构
完成这个实验,只须要知道DFA就能够了。
函数
什么是有向图:由顶点和有方向的边构成的图
如何在程序中存储有向图?
可使用数据结构中学的“邻接矩阵”
“邻接矩阵”就是一个“二维表”
设计
采用面向对象的方式编程,没有对象就new一个。3d
状态结点类的总体构造是这样的👇
对象
DFA的总体构造是这样的👇blog
5元组对应5个属性,其它还应该有状态表结点个数、字母表字符个数、最大存储的结点个数等属性。👇
递归
经过书上的一个DFA例子,理解一下状态集合、终结点集合、字母表集合是这样存储的👇
字符串
选用例3-1 有穷自动机M: ({q0,q1,q2},{0},转换函数,q0,{q2}),做为样例
这个自动机功能是:识别偶数个0,好比00是合法的句子;而000就是非法的句子。
状态转换表以下
下图是例题3-1的DFA图👇
init()函数初始化例3-1的自动机👇,把例3-1的五元组分别存储到实例对象的5个属性中
graphInit()函数初始化状态转换表
状态集合、终结点集合、字母表集合是这样存储的👇
而后试着理解状态转换表的存储👇
run()启动函数👇
dfs()核心递归程序👇
例3-1的DFA,功能:只识别偶数个0的句子。
主函数:
运行效果:
下次再写吧。 有疑问能够在评论区提出