【问题标题】:What is a generalized suffix tree?什么是广义后缀树?
【发布时间】:2014-01-19 05:47:15
【问题描述】:
我看到了维基百科页面,但仍然不清楚这个想法。
要找到 2 个字符串(T 和 S)的最长公共子字符串,我读过我们必须为字符串 T($1)S($2) 构建一个后缀树,其中`($1) 和 ($2) 是不属于字符串的特殊字符。
但是字符串ABAB 和BABA 的维基百科图像看起来像这样:
为什么它不包含整个字符串 ABAB($1)BABA($2) ?不是串接字符串的后缀吗?
叶子上的数字是什么?
【问题讨论】:
标签:
string
data-structures
substring
suffix-tree
string-algorithm
【解决方案1】:
广义后缀树是后缀树的变体,其中存储了两个(或更多)不同字符串 T1 和 T2 的后缀,而不仅仅是一个字符串T的后缀。
构建通用后缀树的一种方法是首先为 T1$1T2$2。这个生成的后缀树将包含 T1 和 T2 的所有后缀,但它也会包含许多以 T1 开头的“虚假”后缀 并传播到 T2。为了解决这个问题,在构建初始后缀树之后,您通常会在树结构上进行第二次遍历,并消除任何超出 $1 标记的后缀。这就是为什么,例如,您在上面给出的广义后缀树不包含 ABAB$1BABA$2。
至于您的下一个问题 - 叶子中的数字是多少? - 后缀树中的每个叶子通常都用叶子对应的后缀的起始索引进行标记。在广义的后缀树中,每个叶子都被标记了两条信息——后缀的起始索引,以及后缀属于哪个字符串。叶子上的符号 a:b 表示“这个后缀来自字符串 a,它从该字符串中的索引 b 开始。”例如,最左边叶子上的标记 1:3 表示“这个后缀来自字符串 1,它从位置 3 开始”。您可以看到这对应于后缀 A$1,它确实从 ABAB$1 中的位置 3 开始,假设为 1-indexing。
希望这会有所帮助!