【问题标题】:How and when to create a suffix link in suffix tree?如何以及何时在后缀树中创建后缀链接?
【发布时间】:2012-04-27 10:15:03
【问题描述】:

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

如果我的字符串是ABABABC,但如果这样更好,请使用不同的示例。

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

非常感谢。

【问题讨论】:

  • 请参考stackoverflow.com/questions/9452701/…>

标签: algorithm suffix-tree


【解决方案1】:

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

  • 内部节点
  • 叶节点

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

有两点需要注意:

  • 内部节点总是有超过 1 个出边。那是, 内部节点标记树中发生分支的部分。

  • 在涉及重复字符串的地方发生分支,并且仅 那里。对于任何内部节点 X,从 root 到 X 必须在输入字符串中至少出现 次 因为有来自 X外向边

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

关于后缀链接:

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

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

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

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

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

示例:

这是和以前一样的后缀树;虚线表示 后缀链接。如果从蓝色节点开始,按照后缀 从那里链接(从蓝色到绿色,到第一个灰色,到第二个灰色), 并查看从根到每个节点的字符串,您将 看到这个:

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

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

它们有什么用?

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

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


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

【讨论】:

  • "对于任何内部节点 X,从根到 X 的字符串在输入字符串中出现的次数必须与从 X 的出边一样多。"子串 AB 在 ABABABC 中出现了 3 次,但是从路径标记为 AB 的灰点只有 2 条出边。
  • @librik 谢谢。我已经插入了“至少”这个词。我相信这使它成为一个正确(并且仍然有用)的陈述。
  • 非常清晰和温和的介绍。我只想添加后缀链接也存在于标有单个字符的节点中,返回到根节点。
  • @j_random_hacker 是的,没错。我没有将它们包含在描述中的原因是它们不需要明确地添加到树中。如果在树构造过程中系统地将后缀链接添加到树中(如 Ukkonen 算法中的情况),您可以简单地假设 any 没有传出后缀链接的内部节点是单因此,字符节点及其后缀链接必须通向根节点。但确实,至少概念上这些后缀链接仍然存在。
  • 嘿@jogojapan - 首先,我要亲自感谢您的回答以及关于 Ukkonen 的简单英语的出色回答。但是,我仍然认为“它们有什么用”部分描述了它们是如何使用的,假设它们已经存在。 OP 想知道的是我们什么时候创建后缀链接。我想这对你来说是微不足道的,一旦添加了一个内部节点,你就可以立即向先前创建的内部节点添加一个后缀链接,并且涵盖了我们需要创建的所有后缀链接——但这对我来说并不直观......
猜你喜欢
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 2016-06-24
  • 2012-04-21
  • 2011-11-19
  • 2012-06-16
  • 1970-01-01
相关资源
最近更新 更多