O(n)线性构造后缀树详解(二)
声明: 此为 Esko Ukkonen 论文翻译,由于本人才疏学浅,为了使用后缀树来进行DNA匹配,翻译此论文,完全是顺带之举,如有错误,请见谅!同时也是发现网上类似资料都不完整,顾发出翻译原版论文来,仅供学习交流之用。
其实我多想用Latex来翻译排版的,不过为了发出来交流,排版系统也就没有用了。
欢迎大家前来研讨!
O(n)线性构造后缀树详解(一):http://www.cnblogs.com/greenhat/archive/2012/11/28/2790585.html
3. 后缀树
后缀树是一种数据结构,表示字符串长度为
的线性空间的
。
的获得仅需通过
的状态的子集
。我们把在
中的状态叫做明确状态(explicit states)。集合
是由
所有分支状态(从该状态至少有2个转换)和所有叶子状态组成(该状态无法继续转换)。由定义可知,root是包含在分支状态的。
的其他状态(该状态不像root 和
有确切的转换)被称为隐式状态(implict states),在
不会被明确提出。
如图:(来自李家同学生讲稿)
通过在中两个明确状态s和r的转换路径(字符串w)来生成
的转换函数
。为了节约空间,字符串w对于T来说,实际上代表一对指针(k,p)(k为左指针,p为右指针,
)。通过这种方式生成转换来得到
。
这种指针存在的原因是因为这儿必须存在后缀,
在
转换路径由s到r。我们选择最小的 i,让k和p指向
的子串(通过s到r的路径来阐述)。如果
,转换函数
被称为a–transition。每个s最多有一个a–transition (
)。
转换函数以相似的方式来表述:
。对于j = 1,…,m,
表示
。当
时,
最多包含
个分支状态。在
中的状态,最多
次转换。因为使用指针来代替确切的字符串,所以每个花费的都是常量空间。(这里我们假定标准的RAM(random acess memory模型,一个指针占有常量的空间)。
我们再次通过后缀函数来扩展结构,现在我们只对
的所有分支状态定义为
,y是一个分支状态,所以
,
。
是意义明确的:如果
是一个分支状态,那么
也是一个分支状态。这些后缀链被明确的表示。有时候隐式后缀链(implicit suffix links)也是有帮助的, 也就是,隐式状态之间的后缀链。
我们通过reference pair(s,w)来指定后缀树的明确状态或者隐式状态r, s 是r的先祖中某个明确状态,w对应从s到r转换的字符串。如果s是最接近r的先祖(因此,w是最短的),那么引用对是规范的。对于一个明确状态r规范的引用对明显是。我们把字符串w表示成
指针对(
)。通过这种方式,引用对
得到
的形式。
表示为
。
为了技术实现上的方便,忽略后缀树定义的最终状态。在一些应用程序中,当最终的明确状态是需要的时候,通过给T加上结束的标记符(T中的其他位置不存在)来得到。T的后缀树的子叶与T的后缀一一对应,构成了最终状态集合。另一种可能是通过从子叶到root遍历后缀链路径,在路径上的所有状态都是明确的,这些状态是
的最终状态。在
的许多应用中,每个后缀的开始位置被存储与状态对应。这样的扩展树能够当作寻找T的任何子串的索引来使用。
第二部分到处结束,最好一部分将于近期上传!!!!
本部分总结
来自李家同教授学生的演讲稿: