什么是通用后缀树?

时间:2014-01-01 18:24:50

标签: string data-structures substring suffix-tree string-algorithm

我看到了维基百科页面,但仍然不清楚这个想法。

要找到2个字符串(TS)中最长的公共子字符串,我读过我们必须为字符串T($1)S($2)构建一个后缀树,其中`($ 1 )和($ 2)是不属于字符串的特殊字符。

但字符串ABABBABA的维基百科图像如下所示: Generalized suffix tree

为什么它不包含整个字符串ABAB($1)BABA($2)?它不是串联字符串的后缀吗?

树叶上的数字是多少?

1 个答案:

答案 0 :(得分:6)

广义后缀树是后缀树的变体,其中存储了两个(或更多)不同字符串T 1 和T 2 的后缀,而不仅仅是一个字符串T的后缀。

构建通用后缀树的一种方法是首先为T 1 $ 1 T 2 $ 2 。这个结果后缀树将包含T 1 和T 2 的所有后缀,但它也会包含很多" spurious"以T 1 开头并扩展到T 2 的后缀。要解决这个问题,在构建初始后缀树之后,通常会对树结构进行第二次传递,并消除任何延伸超过$ 1 标记的后缀。这就是为什么,例如,您在上面给出的广义后缀树不包含ABAB $ 1 BABA $ 2

关于你的下一个问题 - 树叶中的数字是多少? - 后缀树中的每个叶子通常用叶子对应的后缀的起始索引标记。在通用后缀树中,每个叶子都标有两条信息 - 后缀的起始索引和后缀所属的字符串。叶子上的符号a:b表示"该后缀来自字符串a,它从该字符串中的索引b开始。"例如,最左边的叶子上的标记1:3表示"该后缀来自字符串1,它从位置3开始。"您可以看到这对应于后缀A $ 1 ,它确实从ABAB $ 1 中的位置3开始,假设为1索引。

希望这有帮助!