O(n)线性构造后缀树详解(一)
声明: 此为 Esko Ukkonen 论文翻译,由于本人才疏学浅,为了使用后缀树来进行DNA匹配,翻译此论文,完全是顺带之举,如有错误,请见谅!同时也是发现网上类似资料都不完整,顾发出翻译原版论文来,仅供学习交流之用。
其实我多想用Latex来翻译排版的,不过为了发出来交流,排版系统也就没有用了。
欢迎大家前来研讨!
beginning:
摘要:
本文提出了一个对给定长度的字符串进行后缀树构造的线性时间on-line算法。这种新算法有从左到右处理字符串字符的理想特性,通过字符串的逐步扫描来不断的更新后缀树。对于(平方大小)后缀字典树(suffix tries),这种方法作为一个非常简单的线性时间版本的算法而被开发。当字符串不是很长的时候,不用管平方(quadratic)时间复杂度的最坏情况,这个算法是很好很实用的。该方法的变形是通过以自然的方式的来构造著名的后缀树自动机(suffix tree automata (DAWGs))算法。
关键词: 线性时间算法, 后缀树, 后缀字典树, 后缀自动机, DAWG.
1.引言
后缀树是一种代表字符串所有后缀的类似字典的数据结构。在字符串许多算法中,后缀树是至关重要的[3,7,2]。然而在历史文化之中,普遍存在线性时间的后缀树算法相当难掌握的观念。
本文的主要目的是尝试开发一种容易理解和自然的方法(就像以一种本质的方式来完成我们的想象)来构造后缀树。新的算法有一个在线(on-line)的重要性质。它通过字符从左到右来处理字符串中的字符,后缀树是为已扫描的部分字符串准备的(也就是不断的更新)。这个算法是基于简单的观察,即一个字符串 Ti = t1...ti 的所有后缀通过在字符串 Ti-1 = t1...ti-1 的所有后缀末尾连接上一个字符ti或者加上一个空后缀而获得。整个字符串 T=Tn = t1 ... tn 的后缀通过T0->T1->...->Tn-1 迭代, 直到T的后缀从Tn-1获得。
这个方法与Weiner [13]的方法刚刚相反,Weiner是从右向左处理,同时以后缀长度递增的顺序,从最短的后缀开始,把字符串后缀加到树当中。McCreight [9]的方法是以后缀长度递减的顺序,把字符串后缀加到树当中。应该注意的是,尽管直观上看待问题有明显的区别,但我们的算法和McCreight的算法在最终的功能形式是相当接近的,有联系的。
我们的算法最好理解成另一种针对(平方大小 quadratic-size)后缀字典树算法(suffix tries)[12] 的线性时间版本。在后面的第二节(section 2)有一种非常基本的算法,可以类似于posotion tree algorithm [8]。不幸的是,它不是运行在线性时间, 它花费的时间与后缀字典树的大小(平方quadratic)成比例。然而,一种相当明显的修改方法被我们放在第四节(section 4)来描述,修改之后,我们将得到在线(on-line),线性时间(linear-time)方法来构造后缀树。同时也为深刻理解线性时间构造后缀树提供了自然的观点。
我们也会在第5节(section 5)通过用后缀链(suffix link)扩展后缀字典树来阐述后缀自动机(suffix automata)的基本特性(也称作有向无环字词图(directed acyclic word graphs)或者DAWGs)。这直接引导出了构造自动机算法。幸运的是,最终的方法在本质上与之前给出的[4-6]是一致的。从感觉上来说,我们的新观点是非常自然,并且能够有效帮助理解后缀自动机的构造。
2.构造后缀字典树
T= t1 ... tn 是通过字母表集合来构造字符串,假设T=uxv, 并且u,v是字符串(可能为空),每个字符串 x 是 T 的一个子串。每个字符串 Ti = ti...tn (1<= i <=n+1)是T的一个后缀,特别把Tn+1标记为
,表示一个空后缀。T的所有后缀集合表示为
,T的后缀字典树是一个代表
的字典。
更正式地说,我们把T的后缀字典树表示为STrie(T)=(Q U{},root,F,g,f ),定义这样一个字典树作为一个扩展的确定有限自动机,该自动机有代表
字典的树状转换图, 该图由被称为后缀函数的f和辅助状态
来扩展,STrie(T)状态集合Q与T的子串一一对应。我们将
状态与x子串相对应表示。
初始化状态root对应空串,最终状态F集合对应
. 对于Q中所有的
, y = xa (
),转换函数g被定义为
。
为每个状态定义了如下的后缀函数f. 让
,如果x=ay(
),我们设置了
。此外,
.
辅助状态允许我们写出的算法在最终以至于空后缀和非空后缀之间明显的区别被避免(或者说,根与其他状态)。状态
通过
来连接字典树。我们让
未定义(注意:状态
到root的转换与其他转换是一致地:状态
对应
(所有的字符
),因为
,所以我们设置
,即root 对应
)。
根据[9],我们称f(r)为状态r的后缀链(suffix link),在构造后缀树时,后缀链将会很实用,
在应用程序中有很多实际运用[11,12]。
针对关键词集合,STrie(T)自动机与Aho–Corasick字符串匹配自动机[1]是相同的(在[1]中,后缀链(suffix link)被称作错误转移(failure transitions)))。
图 1. 构造STrie(cacao):状态转换用粗箭头表示,错误转移用细箭头表示。注意:只有最后2层的后缀链(suffix link)被明确的表示
通过如下方式从左到右扫描整个T,很容易在线(on-line)构造STrie(T). 让表示T的前缀t1 · · · ti(0<= i <= n).
作为构造后缀字典树的中间结果。在图1中,我们展现了
不同阶段的构造。
观察的结果解释了是怎样从
获得的。(
的所有后缀是通过在
的每个后缀链接上
或者空后缀)。也就是
根据定义,接受
。为了确保
,我们必须检测
的最终状态集
。如果
没有进行
,从r到新状态(新状态将成为字典树的一个新子叶)的转移将会被加上。
通过如下使用后缀链(suffix links),状态将会找到新的转换。后缀函数的定义暗含了
,当且仅当
,因此
所有的状态都是从
的最深的状态
到
结束的后缀链(suffix links)路径,这种重要的路径被称作
的边界路径(boundary path)。
通过遍历边界路径,如果在边界路径上的状态还没有进行
,那么新的状态
和新的转换
将被加入到字典树中,从而使得g被更新,为了得到更新的f,新的状态
与新的后缀链将被链接在一起,从而形成与一个由状态
开始的路程,这就是
的边界路径。
沿着边界路径遍历,当第一个状态
被找到,遍历会立即被终止。如果
已经是一个其中的状态,那么
必定也包含状态
(转移函数
,对于所有的
)。换句话来说,如果
是
的一个子串,那么
的任何后缀都是
的一个子串。注意:因为
是边界路径的最后一个状态,
与任何可能的
都有一个转移,所以
状态总是存在。
在遍历后缀链期间,该程序将会为每一个遍历过的后缀链创建一个新的状态。这也就暗示了所要花费的时间将与生成的自动机的大小成正比。
从开始,
仅包含root和
,以及他们之间的链,对
,迭代Algorithm 1,我们显然可以得到
。从某种意义上来说,这个算法是最佳的,它花费的时间与最终结果
的大小成正比。反过来,即与
成正比(也就是说,T不同子串的数目),不幸的是,
是平方级(n(n+1)/2 –> O(n^2))。
定理 1:后缀字典树能够以与
的大小成比例的时间来构造,构造的最坏情况是
。
由于论文篇幅过大,顾先上传1/3内容,看看大伙的反应,余下将于最近更新!!!
引用:
1. A. Aho and M. Corasick, Efficient string matching: An aid to bibliographic
search, Comm. ACM 18 (1975), 333–340.
2. A. Amir and M. Farach, Adaptive dictionary matching, in Proc. 32nd
IEEE Ann. Symp. on Foundations of Computer Science, 1991, pp. 760–
766.
3. A. Apostolico, The myriad virtues of subword trees, in Combinatorial
Algorithms on Words (A. Apostolico and Z. Galil, eds.), Springer–
Verlag, 1985, pp. 85–95.
4. A. Blumer & al., The smallest automaton recognizing the subwords of
a text, Theor. Comp. Sci. 40 (1985), 31–55.
5. M. Crochemore, Transducers and repetitions, Theor. Comp. Sci. 45
(1986), 63–86.
6. M. Crochemore, String matching with constraints, in Mathematical
Foundations of Computer Science 1988 (M.P. Chytil, L. Janiga and V.
Koubek, eds.), Lect. Notes in Computer Science, vol. 324, Springer–
Verlag, 1988, pp. 44–58.
7. Z. Galil and R. Giancarlo, Data structures and algorithms for approximate
string matching, J. Complexity 4 (1988), 33–72.
8. M. Kempf, R. Bayer and U. G¨untzer, Time optimal left to right construction
of position trees, Acta Informatica 24 (1987), 461–474.
9. E. McCreight, A space–economical suffix tree construction algorithm,
Journal of the ACM 23 (1976), 262–272.
10. E. Ukkonen, Constructing suffix trees on–line in linear time, in Algorithms,
Software, Architecture. Information Processing 92, vol. I (J.
van Leeuwen, ed.), Elsevier, 1992, pp. 484–492.
11. E. Ukkonen, Approximate string–matching over suffix trees, in Combinatorial
Pattern Matching, CPM’93 (A. Apostolico, M. Crochemore,
Z. Galil, and U. Manber, eds.), Lect. Notes in Computer Science, vol.
684, Springer–Verlag, 1993, pp. 228–242.
12. E. Ukkonen and D. Wood, Approximate string matching with suffix
automata, Algorithmica 10 (1993), 353–364.
13. P. Weiner, Linear pattern matching algorithms, in IEEE 14th Ann.
Symp. on Switching and Automata Theory, 1973, pp. 1–11.
下面总结专题(一)的核心:
下面的内容截选自 Prof. R.C.T. Lee(李家同教授--台湾(大师级别))的学生C. S. Wu (吳展碩)的讲稿。