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 是通过字母表集合image来构造字符串,假设T=uxv, 并且u,v是字符串(可能为空),每个字符串 x 是 T 的一个子串。每个字符串 Ti = ti...tn (1<= i <=n+1)是T的一个后缀,特别把Tn+1标记为 image,表示一个空后缀。T的所有后缀集合表示为image,T的后缀字典树是一个代表image的字典。

      更正式地说,我们把T的后缀字典树表示为STrie(T)=(Q U{image},root,F,g,f ),定义这样一个字典树作为一个扩展的确定有限自动机,该自动机有代表image字典的树状转换图, 该图由被称为后缀函数的f和辅助状态image来扩展,STrie(T)状态集合Q与T的子串一一对应。我们将image状态与x子串相对应表示。

     初始化状态root对应空串image,最终状态F集合对应image. 对于Q中所有的image, y = xa (image),转换函数g被定义为image

     为每个状态image定义了如下的后缀函数f. 让image,如果x=ay(image),我们设置了image。此外,image.

     辅助状态image允许我们写出的算法在最终以至于空后缀和非空后缀之间明显的区别被避免(或者说,根与其他状态)。状态image通过image来连接字典树。我们让image未定义(注意:状态 image到root的转换与其他转换是一致地:状态image对应image(所有的字符image),因为image,所以我们设置image,即root 对应image)。

    根据[9],我们称f(r)为状态r的后缀链(suffix link),在构造后缀树时,后缀链将会很实用,

在应用程序中有很多实际运用[11,12]。

      针对关键词集合image,STrie(T)自动机与Aho–Corasick字符串匹配自动机[1]是相同的(在[1]中,后缀链(suffix link)被称作错误转移(failure transitions)))。

image

图 1. 构造STrie(cacao):状态转换用粗箭头表示,错误转移用细箭头表示。注意:只有最后2层的后缀链(suffix link)被明确的表示

通过如下方式从左到右扫描整个T,很容易在线(on-line)构造STrie(T). 让image表示T的前缀t1 · · · ti(0<= i <= n). image作为构造后缀字典树的中间结果。在图1中,我们展现了image不同阶段的构造。

     观察的结果解释了image是怎样从image获得的。(image的所有后缀是通过在image的每个后缀链接上image或者空后缀)。也就是

                    image

 

根据定义,image接受image。为了确保image,我们必须检测image的最终状态集image。如果image没有进行image,从r到新状态(新状态将成为字典树的一个新子叶)的转移将会被加上。

     通过如下使用后缀链(suffix links),状态image将会找到新的转换。后缀函数的定义暗含了image,当且仅当image,因此image所有的状态都是从image的最深的状态imageimage结束的后缀链(suffix links)路径,这种重要的路径被称作image边界路径(boundary path)。

     通过遍历边界路径,如果在边界路径上的状态image还没有进行image,那么新的状态image和新的转换imageimage将被加入到字典树中,从而使得g被更新,为了得到更新的f,新的状态image与新的后缀链将被链接在一起,从而形成与一个由状态image开始的路程,这就是image的边界路径。

     沿着边界路径遍历image,当第一个状态image被找到,遍历会立即被终止。如果image已经是一个其中的状态,那么image必定也包含状态image(转移函数image,对于所有的image)。换句话来说,如果imageimage的一个子串,那么image的任何后缀都是image的一个子串。注意:因为image是边界路径的最后一个状态,image与任何可能的image都有一个转移,所以image状态总是存在。

     在遍历后缀链期间,该程序将会为每一个遍历过的后缀链创建一个新的状态。这也就暗示了所要花费的时间将与生成的自动机的大小成正比。

   总结, image创建image的过程的算法描述如下[12]。

   这儿top表示image状态。

 

image

     从image开始,image仅包含root和image,以及他们之间的链,对image,迭代Algorithm 1,我们显然可以得到image。从某种意义上来说,这个算法是最佳的,它花费的时间与最终结果image的大小成正比。反过来,即与image成正比(也就是说,T不同子串的数目),不幸的是,image是平方级(n(n+1)/2 –> O(n^2))。

定理 1:后缀字典树image能够以与image的大小成比例的时间来构造,构造的最坏情况是image

 

 

 

由于论文篇幅过大,顾先上传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 (吳展碩)的讲稿。

image

image

image

image

image

image

image

image

image

image

image

image

image

posted on 2012-11-28 20:49  greenhat  阅读(3697)  评论(0编辑  收藏  举报

导航