Suffix automaton
Deterministic acyclic finite state automaton,也叫directed acyclic word graph(DAWG),是一个识别若干字串的无环DFA。识别若干字串的所有DAWG中,存在唯一一个状态数最少的DAWG,称作minimal DAWG,即识别这个字串集的DFA。
DAWG在有些文献中也指识别一个字串的所有后缀的自动机,这种用法有个更常见的名称:suffix automaton,此时该自动机可以看做是字串所有后缀的DAWG。
定义
Factor,即子串。
, 的所有子串。比如 。 表示 的所有后缀的集合。比如 。 表示 中 所有出现位置右边的串的集合。比如对于 ,其 。 表示 中 和 的出现位置集合相同,即 。 为串 中子串 的suffix function: 的最长后缀 ,满足 。 无定义。当 定义在 的所有后缀上时就得到了suffix link,因此suffix function是suffix link的推广,用于处理factor的集合。 用上标表示函数应用的次数,即
, , ……
一些引理
在考虑
引理1
给
对于
引理2
令
证明:
- 若
,则 是 中出现过的 的一个后缀,由 定义知 。 - 存在最大的非负整数
使得 , 由 性质有 , 又 ,故 。 因此 即 。 - 因此
。对称地, 。 所以 和 同时在 中或同时不在。 - 根据引理1,即
与 的关系知 。
这条引理说明,对于
引理3
依旧令
下面的引理则说明,
。 - 由引理1和
知 - 由
知 ,故 。因此 - 前两式得
- 由引理1和
,其中 为满足 的 中最长子串,且不是 的后缀。 和 都不是 的后缀
如果第二个分类不为空,则
性质
长度a
时即可取到下界。
另外对于
记
构建
采用一个在线算法构建字串
添加字符
未在 中出现 只多了一个状态 ,该状态的suffix function为起始状态。 所有后缀的状态都应添加在字符 上的转移,指向新状态。方法是从 出发,追溯 得到的所有状态都添加指向新状态的边。 在 中出现 从 出发,追溯 ,直到遇到第一个顶点 存在字符 上的转移,设转移到 。 表示的最长串(长度为 )后添加 就是 (长度为 )。 的等价类则表示 中与 等价的所有 。 然后再分两种情况: - 若
,则 的长度大于等于 中与 等价的任一 。 的等价类(表示为状态 )不会分裂。Suffix automaton只多了一个表示 等价类的状态 , ,其 ,包含与 ,因此设置 。 - 若
,则存在 , 需要拆分为两个状态,分别表示 (状态 )和 (新状态 ), 继承 的所有边, , 需要修改为 。另外还要沿着 ,把沿路状态在 上的转移改为 。
- 若
稍作修改该算法即可用于多串suffix
automaton的构建。处理新字串时,把
1 | struct Node |
性质
另
表示从 开始,沿著 函数回溯得到的所有状态,accepting states是 。 Suffix automaton中所有边
形成一棵spanning tree。 ,所以对于suffix automaton中任意顶点 , 对于边
, ,所以可以对所有顶点的 值做计数排序,达到拓扑排序的效果。
辅助数据结构
设
对所有状态拓扑排序后,根据其逆序计算即可求出各个状态的
应用
- 列出模式串在文本串中所有匹配位置(all occurrences)。
- 求出最长的出现至少
次的子串。寻找最深的节点 满足 ,其深度即为答案。 - Ending factors。给定两个串
和 ,对于 的所有前缀 ,求出 的最长后缀为 的子串。可用于计算两串的最长公共子串。 - Searching for rotations。给定两个串
和 , 的任意rotation(或称为conjugate)在 中出现的位置。技巧是把 和自身拼接,得到 ,它包含 的 个rotation,转化为 和 的ending factors问题。 个串的最长公共子串。求 次ending factors。
相关数据结构
Factor automaton
Suffix automaton有个类似的数据结构,称作factor automaton,它识别一个字串的所有子串,可以看作识别所有子串的minimal DAWG。
求出
反过来,可以通过factor automaton获得suffix automaton。参见Maxime Crochemore、Christophe Hancart的《Automata for Matching Patterns》中的FA-to-SA。
Suffix oracle和factor oracle
Suffix oracle是一种简化的suffix automaton。
某次添加字符
Suffix oracle可以看作是suffix automaton合并了一些状态后得到的自动机。其接受的串的集合是suffix automaton接受的串的集合的超集,也就是说它不会遗漏suffix automaton接受的串,但可能会有误判。
Suffox oracle的优点是节点数为
把suffix oracle的所有状态标记为可接受即得到factor oracle,且已是最简形态,无法minimize。
其他类似数据结构
Position heap
比suffix tree简单,存在一个
参考文献
Allauzen C., Crochemore M., Raffinot M., Factor oracle: a new structure for pattern matching; Proceedings of SOFSEM’99; Theory and Practice of Informatics.
@article{Revuz:1992:MAD:135853.135907, author = {Revuz, Dominique}, title = {Minimisation of Acyclic Deterministic Automata in Linear Time}, journal = {Theor. Comput. Sci.}, issue_date = {Jan. 6, 1992}, volume = {92}, number = {1}, month = jan, year = {1992}, issn = {0304-3975}, pages = {181--189}, numpages = {9}, url = {http://dx.doi.org/10.1016/0304-3975(92)90142-3}, doi = {10.1016/0304-3975(92)90142-3}, acmid = {135907}, publisher = {Elsevier Science Publishers Ltd.}, address = {Essex, UK}, }