说明

学习自动机理理论的笔记

自动机层次

自动机要解决的问题 : 字符串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构建正则表达式

简化正则表达式

应用