关于算法:如何以及何时在后缀树中创建后缀链接?

How and when to create a suffix link in suffix tree?

有人能给我一个关于如何和何时在后缀树中创建后缀链接的例子吗?

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

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

非常感谢。


要理解这一点,首先要记住有三种节点在后缀树中:好的。

  • 内部节点
  • 叶节点

在下图中,这是EDOCX1的后缀树(0),黄色圆是根,灰色、蓝色和绿色是内部的节点,小的黑色的是树叶。好的。

>好的。<P>有两件重要的事情需要注意:好的。</p>
<ul>
<li><P>内部节点总是有一个以上的传出边缘。也就是说,内部节点标记树中发生分支的部分。好的。</li>
<li><P>分支发生在涉及重复字符串的任何位置,并且仅那里。对于任何内部节点x,从输入字符串中的根到x必须至少出现多次因为有X的输出边。好的。</li>
</ul>
<p><P>示例:指向蓝色节点的字符串是<wyn>ABAB</wyn>。的确,此字符串在输入字符串中出现两次:在位置0和位置2。这就是蓝色节点存在的原因。好的。<P>关于后缀链接:好的。</p>
<li><P>如果指向某个内部节点x的字符串s较长少于1个字符,相同的字符串减去第一个字符(称之为S<Sub>-1<Sub>)也必须在树中(它是一个毕竟后缀树,因此其任何字符串的后缀必须是也在树上)。好的。<P>示例:让s=<wyn>ABAB</wyn>,指向蓝色节点的字符串。然后删除第一个字符后,s<sub>-1<sub>是<wyn>BAB</wyn>。和实际上,在树上也发现了这个字符串。它通向绿色节点。好的。</li>
<li><P>如果某些字符串指向一个内部节点,则将其缩短版本S<sub>-1<sub>必须导致内部节点(调用它x<sub>-1<sub>)也一样。为什么?因为S必须至少出现两次输入字符串,因此s<sub>-1<sub>必须至少出现多次(因为它是S的一部分:无论S出现在哪里,s<sub>-1</sub>也必须出现)。但如果S<Sub>-1在输入字符串中出现多次,则必须它的内部节点。好的。</li>
<li><P>在任何这种情况下,连接x到x的特殊链接是后缀链接。好的。</li>
<p><P>注:由于上述(1)和(2),每个内部节点x从根到x的标签超过1个字符必须具有后缀链接到另一个内部节点。好的。<P>例子:好的。<P><img src=

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

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

它们有什么用?好的。

它们对许多事情都有好处。但是,他们玩后缀树Ukkonen算法中的特殊作用特别是建筑在这里描述的规则3中:插入最后一个字符后在某些点x的后缀s中,算法需要插入后缀s的最后一个字符在o(1)time中。在为此,它使用后缀链接直接跳转到该位置。x-1并进行插入。好的。

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

关于单字符节点:如果有一个内部节点x,其字符串(即从根到x路径上的字符串)只包含一个字符,该怎么办?根据上面的定义,x没有后缀链接。但是,您可以假定如果它有一个后缀链接,它将指向根节点。此外:根据上面的定义,如果内部节点没有后缀链接,则它必须是一个单字符节点,因此可以始终假定,如果内部节点没有后缀链接,则它必须是一个单字符节点,因此,表示s-1后缀的节点是根节点。(在本例中,有些算法可能会添加指向根节点的显式后缀链接。)感谢J_Random_Hacker对此的评论。好的。好啊。