如何以及何时在后缀树中创建后缀链接?

时间:2012-04-16 02:33:58

标签: algorithm suffix-tree

有人能举例说明如何以及何时在后缀树中创建后缀链接?

如果我的字符串是ABABABC,但如果更好,请使用其他示例。

希望能给出一些图片来说明每一步。

非常感谢。

1 个答案:

答案 0 :(得分:58)

要理解这一点,首先回想一下有三种节点 在后缀树中:

  • 内部节点
  • 叶节点

在下图中,ABABABC的后缀树是黄色 circle是 root ,灰色,蓝色和绿色是内部 节点,小黑点离开。

有两件重要的事情需要注意:

  • 内部节点始终具有多个传出边。那是, 内部节点标记树的分支发生的那些部分。

  • 只有涉及重复字符串的地方才会发生分支 那里。对于任何内部节点X,从 root到X必须在输入字符串中至少发生次 因为X 传出边

示例:指向蓝色节点的字符串为ABAB。确实,   此字符串在输入字符串中出现两次:位置0和位置   这就是蓝色节点存在的原因。

现在关于后缀链接:

  1. 如果字符串 s 导致某个内部节点X更长 超过1个字符,相同的字符串减去第一个字符 (称之为 s -1 )也必须在树中(这是一个 毕竟后缀树,所以它的任何字符串的后缀必须是 在树上也是如此。

    示例:设s = ABAB,该字符串指向蓝色节点。然后 删除第一个字符后,s -1 BAB。和 事实上,这个字符串也可以在树中找到。它导致绿色 节点

  2. 如果某个字符串 s 指向内部节点,则会缩短它 版本s -1 必须通向内部节点(调用 它也是X -1 )。为什么?因为 s 必须至少出现两次 输入字符串,因此 s -1 必须至少出现次数 (因为它是 s 的一部分:出现 s 的地方, s -1 也必须出现。但是如果 s -1 在输入字符串中出现多次,那么必须有一个 它的内部节点。

  3. 在任何此类情况下,将X连接到X -1 的特殊链接是 后缀链接。

  4. 注意:由于上面的(1)和(2),每个内部节点X   有一个从根到X的标签超过1个字符必须有一个   后缀链接到另一个内部节点。

    示例:

    这是与以前相同的后缀树;虚线表示 后缀链接。如果从蓝色节点开始并按照后缀进行操作 从那里链接(从蓝色到绿色,到第一个灰色,再到第二个灰色), 然后看看从根到每个节点的字符串 看到这个:

     ABAB   ->    BAB    ->    AB    ->    B
    (blue)      (green)     (gray1)     (gray2)
    

    这就是为什么它们被称为后缀链接(整个序列是 称为后缀链)。

    它们有什么用?

    它们对许多事情都有好处。但是,他们发挥了作用 特别是在Ukkonen's algorithm for suffix tree construction中的特殊角色 在规则3 中描述:插入最后一个字符后 某些后缀 s 在某个点X,算法需要插入 O(1)时间内后缀 s -1 的最后一个字符。在 为了做到这一点,它使用后缀链接直接跳转到该位置 X -1 并进行插入。

    但是,请注意没有必要在后缀树中添加后缀链接。它们不是后缀树定义的一部分 - 它们只是构造或使用后缀树的一些算法使用的特殊链接。


    关于单字符节点:如果有一个内部节点X,其字符串(即从根到X的路径上的字符串)只包含一个字符怎么办?根据上面的定义,X然后没有后缀链接。但是,您可以假设如果它具有后缀链接,则它将指向根节点。此外:如果根据上面的定义,内部节点没有后缀链接,则它必须是单字符节点,因此您可以始终假设如果内部节点上没有后缀链接,则它必须是单个 - 字符节点,因此,表示s -1 后缀的节点是根节点。 (在这种情况下,某些算法实际上可能会添加一个指向根节点的显式后缀链接。)感谢j_random_hacker对此的评论。