Algorithm 如何以及何时在后缀树中创建后缀链接?
谁能给我一个关于如何以及何时在后缀树中创建后缀链接的例子 如果我的字符串是Algorithm 如何以及何时在后缀树中创建后缀链接?,algorithm,suffix-tree,Algorithm,Suffix Tree,谁能给我一个关于如何以及何时在后缀树中创建后缀链接的例子 如果我的字符串是abababac,但如果更好,请使用不同的示例 希望能提供一些图片来说明每一步 非常感谢。要理解这一点,首先要记住有三种节点 在后缀树中: 根 内部节点 叶节点 下图是abababac的后缀树,黄色 圆圈是根,灰色、蓝色和绿色的圆圈是内部 节点,黑色的小节点是叶子。 有两件重要的事情需要注意: 内部节点始终具有多个传出边缘。就是, 内部节点标记树中发生分支的部分 分支发生在涉及重复字符串的任何地方,并且仅限于 那里
abababac
,但如果更好,请使用不同的示例
希望能提供一些图片来说明每一步
非常感谢。要理解这一点,首先要记住有三种节点 在后缀树中:
- 根
- 内部节点
- 叶节点
abababac
的后缀树,黄色
圆圈是根,灰色、蓝色和绿色的圆圈是内部
节点,黑色的小节点是叶子。
有两件重要的事情需要注意:
- 内部节点始终具有多个传出边缘。就是, 内部节点标记树中发生分支的部分
- 分支发生在涉及重复字符串的任何地方,并且仅限于
那里对于任何内部节点X,从 在输入字符串中,X的根必须至少出现相同的次数 因为有从X传出的边
ABAB
。的确
此字符串在输入字符串中出现两次:位置0和
立场2。这就是蓝色节点存在的原因
现在关于后缀链接:
ABAB
,指向蓝色节点的字符串。然后
删除第一个字符后,s-1为BAB
。及
事实上,该字符串也在树中找到。它通向绿色
节点 ABAB -> BAB -> AB -> B
(blue) (green) (gray1) (gray2)
这就是它们被称为后缀链接的原因(整个序列是
称为后缀链)
它们有什么好处?
它们有很多优点。然而,他们扮演了一个角色
特别是在
在这里描述的规则3中:插入一个字符后,最后一个字符
对于某些后缀s的某个点X,算法需要插入
后缀s-1在O(1)时间中的最后一个字符。在里面
为了做到这一点,它使用后缀链接跳转到正确的位置
X-1并进行插入
但是,请注意没有必要在后缀树中放置后缀链接。它们不是后缀树定义的一部分-它们只是一些构造或使用后缀树的算法使用的特殊链接
关于单字符节点:如果有一个内部节点X的字符串(即从根到X的路径上的字符串)只包含一个字符,该怎么办?根据上面的定义,X没有后缀链接。但是,您可以假设,如果它有一个后缀链接,它将指向根节点。此外:根据上述定义,如果内部节点没有后缀链接,则它必须是单字符节点,因此您可以始终假设,如果内部节点上没有后缀链接,则它必须是单字符节点,因此,表示s-1后缀的节点是根节点。(在这种情况下,某些算法实际上可能会添加指向根节点的显式后缀链接。)感谢j_random_hacker对此的评论。“对于任何内部节点X,从根到X的字符串在输入字符串中出现的次数必须与从X传出的边出现的次数相同。”子串AB在ABABABAC中出现了3次,但只有两条从灰点引出的边,其路径标记为AB。@librik谢谢。我插入了“至少”这个词。我相信这是一个正确的(并且仍然有用的)陈述。非常清晰和温和的介绍。我只想补充一点,后缀链接也存在于标记有单个字符的节点,回到根节点。@j_random_hacker是的,没错。我没有在描述中包含它们的原因是它们不需要显式地添加到树中。如果在树构造过程中系统地将后缀链接添加到树中(如Ukkonen算法中的情况),则可以简单地假设没有传出后缀链接的任何内部节点都是单字符节点,因此其后缀链接必须指向根节点。但事实是,至少在概念上