Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何以及何时在后缀树中创建后缀链接?_Algorithm_Suffix Tree - Fatal编程技术网

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

Algorithm 如何以及何时在后缀树中创建后缀链接?,algorithm,suffix-tree,Algorithm,Suffix Tree,谁能给我一个关于如何以及何时在后缀树中创建后缀链接的例子 如果我的字符串是abababac,但如果更好,请使用不同的示例 希望能提供一些图片来说明每一步 非常感谢。要理解这一点,首先要记住有三种节点 在后缀树中: 根 内部节点 叶节点 下图是abababac的后缀树,黄色 圆圈是根,灰色、蓝色和绿色的圆圈是内部 节点,黑色的小节点是叶子。 有两件重要的事情需要注意: 内部节点始终具有多个传出边缘。就是, 内部节点标记树中发生分支的部分 分支发生在涉及重复字符串的任何地方,并且仅限于 那里

谁能给我一个关于如何以及何时在后缀树中创建后缀链接的例子

如果我的字符串是
abababac
,但如果更好,请使用不同的示例

希望能提供一些图片来说明每一步


非常感谢。

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

  • 内部节点
  • 叶节点
下图是
abababac
的后缀树,黄色 圆圈是,灰色、蓝色和绿色的圆圈是内部 节点,黑色的小节点是叶子。

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

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

  • 分支发生在涉及重复字符串的任何地方,并且仅限于
    那里对于任何内部节点X,从 在输入字符串中,X的根必须至少出现相同的次数 因为有从X传出的边

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

现在关于后缀链接:

  • 如果指向某个内部节点X的字符串s较长 小于1个字符,则相同字符串减去第一个字符 (称之为s-1)也必须在树中(它是一个 毕竟是后缀树,所以它的任何字符串的后缀都必须是 也在树上)

    示例:让s=
    ABAB
    ,指向蓝色节点的字符串。然后 删除第一个字符后,s-1为
    BAB
    。及 事实上,该字符串也在树中找到。它通向绿色 节点

  • 如果某个字符串s指向一个内部节点,则其长度将缩短 版本s-1必须指向内部节点(调用 它也是X-1)。为什么?因为s必须在 输入字符串,因此s-1必须至少出现相同的次数 (因为它是s的一部分:无论s出现在哪里, s-1也必须出现)。但是如果s-1 在输入字符串中出现多次,则必须有 它的内部节点

  • 在任何此类情况下,连接X到X-1的特殊链路都是 后缀链接。

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

    示例:

    这是与以前相同的后缀树;虚线表示 后缀链接。如果从蓝色节点开始并跟随后缀 从那里链接(从蓝色到绿色,从第一个灰色到第二个灰色), 看看从根到每个节点的字符串,您将 见此:

     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算法中的情况),则可以简单地假设没有传出后缀链接的任何内部节点都是单字符节点,因此其后缀链接必须指向根节点。但事实是,至少在概念上