![](http://img.blog.163.com/photo/DCqhtj0Eh6hEd6HvOHYJIA==/3158712188647338663.jpg)
1、 最小后缀自动机
一个串x的最小后缀自动机SA(suffixautomaton),记为SA(x),即识别串x的所有后缀的最小确定自动机.
如图1所示,该自动机可以接受串baabbaa的以下所有后缀:
ε,a,aa,baa,bbaa,abbaa,aabbaa,baabbaa.
已经存在以线性复杂度构造SA的算法,对长度为m的串x,构造时间为O(m),且SA(x)的大小(包括节点数与边数)为O(mσ).
从图1中可以看出,该图有多个起始状态和多个终止状态,不要被其表面的后缀2字引诱,只是说可以接受串的后缀,如果某个串能被这个自动机接受,那这个串必须得按从前向后的顺序读入,而不是从后向前的方式。
2、有限状态自动机
本文所用到的正向有限状态自动机FFA(forward finiteautomata)实际上就是正向识别模式的一般有限状态自动机,只是在运行方式上有所不同.由于在反向后缀自动机运行结束时算法已经匹配了模式的一个(或多个)前缀,所以正向有限状态自动机运行时不是从传统的开始状态开始,而是从已匹配的最大前缀所对应的状态开始.开始状态集合中不包含传统的初始状态,这是因为当前一阶段识别的前缀为ε时,不需要使用FFA进行扫描.在实现中,常常用已识别前缀的长度来表示状态.如图2所示,该自动机使用不同的开始状态1,2,3,4,5,6,7,分别可以接受串aabbaab的不同后缀:abbaab,bbaab,baab,aab,ab,b,ε.
FFA的构造也是一个简单的问题,使用与DFA匹配算法[10]相同的构造算法构造模式的FFA,其构造时间复杂度是O(m+σ),空间复杂度是O(mσ).
本文所用到的正向有限状态自动机FFA(forward finiteautomata)实际上就是正向识别模式的一般有限状态自动机,只是在运行方式上有所不同.由于在反向后缀自动机运行结束时算法已经匹配了模式的一个(或多个)前缀,所以正向有限状态自动机运行时不是从传统的开始状态开始,而是从已匹配的最大前缀所对应的状态开始.开始状态集合中不包含传统的初始状态,这是因为当前一阶段识别的前缀为ε时,不需要使用FFA进行扫描.在实现中,常常用已识别前缀的长度来表示状态.如图2所示,该自动机使用不同的开始状态1,2,3,4,5,6,7,分别可以接受串aabbaab的不同后缀:abbaab,bbaab,baab,aab,ab,b,ε.
FFA的构造也是一个简单的问题,使用与DFA匹配算法[10]相同的构造算法构造模式的FFA,其构造时间复杂度是O(m+σ),空间复杂度是O(mσ).