能否给我一个关于如何在后缀树中创建后缀链接的例子,以及何时创建后缀链接?如果可以,请使用字符串ABABABC
进行示例,或者选择更好的示例。
希望给出一些图片来说明每个步骤。
非常感谢。
能否给我一个关于如何在后缀树中创建后缀链接的例子,以及何时创建后缀链接?如果可以,请使用字符串ABABABC
进行示例,或者选择更好的示例。
希望给出一些图片来说明每个步骤。
非常感谢。
ABABABC
的后缀树,黄色圆圈是根节点,灰色、蓝色和绿色的节点是内部节点,小黑点是叶子节点。
有两个重要的事情需要注意:
内部节点始终具有多于1个的传出边。也就是说,内部节点标记了树中发生分支的部分。
只有在涉及到重复字符串时才会发生分支,而且仅在那里。对于任何内部节点X,从根到X的字符串必须至少在输入字符串中出现与X的传出边一样多的次数。
例如:导致蓝色节点的字符串是ABAB
。确实,在输入字符串中这个字符串出现了两次:在位置0和位置2。这就是为什么存在蓝色节点的原因。
现在来谈谈后缀链接:
ABAB -> BAB -> AB -> B
(blue) (green) (gray1) (gray2)
它们有什么用处?
它们有很多出人意料的用途。然而,在Ukkonen算法中用于后缀树构建的规则3中,它们发挥了特殊作用:在某个点X插入某个后缀s的最后一个字符后,算法需要在O(1)时间内插入后缀s-1的最后一个字符。为了做到这一点,它使用后缀链接跳转到位置X-1并进行插入。
但是,请注意,在后缀树中没有必要放置后缀链接。它们不是后缀树定义的一部分——它们只是一些构建或使用后缀树算法中使用的特殊链接。
关于单字符节点:如果存在一个内部节点X,其字符串(即从根到X的路径上的字符串)仅由一个字符组成,那么会怎样呢?根据上面的定义,X就没有后缀链接。但是您可以假设,如果它有后缀链接,它将指向根节点。此外:如果按照上面的定义,一个内部节点没有后缀链接,那么它必须是一个单字符节点,因此您始终可以假设,如果在内部节点中不存在后缀链接,那么它必须是一个单字符节点,因此表示s-1后缀的节点是根节点。(某些算法实际上可能会在这种情况下添加一个显式的后缀链接,指向根节点。)感谢j_random_hacker对此的评论。