说明
学习自动机理理论的笔记
自动机层次
自动机要解决的问题 : 字符串w是否属于语言L
1.正则语言
某些有限状态机可接受
Myhill-Nerode定理
给定一个语言L,定义在字符串上一个关系\(R_L\),
推论 : 语言L是正则的(就是说可被有限状态机接受),当且仅当\(R_L\)的等价类的数目是有限的
2.上下文无关语言
某些压栈自动机可接受
3.可确定
某些图灵机可接受,总是停机
4.半确定语言
某些图灵机子可以确定对该语言中的所有字符串停机
有限状态机
DFSM确定性有限状态机
NDFSM非确定性有限状态机
一个NDFSM必然有一个对应的DFSM
每个正则语言存在唯一最简DFSM
NDFSM转化为DFSM的算法
最小化DFSM的算法
...网上流传的基本都是Moore算法(子集划分法)...Hopcroft算法的资料很少
网上抄来抄去...极大的增加了检索成本...还有些憨憨说Moore算法是Hopcroft算法...
自动机最小化论文,几种最小化办法都在里面
Moore算法(子集划分法)
记n为状态数量,\(|\sum|\)为字符集大小
最坏复杂度\(O(n^2|\sum|)\),期望复杂度\(O(nlog(n)|\sum|)\),log(n)意味着平均条件下,迭代的深度只有log(n),单次迭代的复杂度是\(O(n|\sum|)\)
把状态划分为终态和非终态集合
不停的划分集合 :如果同一集合中的状态s1,s2,move(s1,ch)、move(s2,ch)不在同一组,那么它们就是可区分的
分裂该集合,继续循环,直到所有集合无法区分,划分即完毕
然后按照原转移关系,在新DFSM上画出转移边即可
Hopcroft算法
看不懂论文Orz,鸽了。
简单来说是对Moore算法的一种改进
Brzozowski算法
一句话:先反着做一遍NFA转DFA, 然后再正着做一遍NFA转DFA
一遍消除冗余前缀,一遍消除冗余后缀
因为你一般都先构造NFA,再转化到DFA,做两次就能最小化...这个办法其实很方便
Brzozowski (1963) 注意到,将DFA的边反转将产生一个原语言反序的NFA。再将这个NFA用标准的幂集构造法(只构造转换后DFA的可达状态)转换为DFA,就会产生原语言反序的最小DFA。重复反转操作,就可以得到原语言的最小DFA。Brzozowski算法在最坏情况下的复杂度是指数的,因为存在这样的正则语言,其反序的最小DFA的规模是原语言DFA规模的指数大。但通常来说这个算法比最坏情况表现得要好
模拟NDFSM的算法
正则表达式
正则表达式和FSM等价,但是针对某个问题,二者的实现难度可能并不一样
运算
Klleen星号 > 连接字符串 > 并
从正则表达式构建FSM
从FSM构建正则表达式
简化正则表达式
应用