【问题标题】:Why we don't use prefix tree (trie) to find longest common substring?为什么我们不使用前缀树(trie)来查找最长的公共子串?
【发布时间】:2014-11-18 01:38:25
【问题描述】:

最近我正在学习如何使用树来解决最长公共子串问题。在从 Wiki 和其他在线资源学习之后,我发现我们应该使用后缀树来查找最长公共子串。

正如维基所说:

一组字符串的最长公共子串可以通过 为字符串构建一个通用的后缀树,然后找到 具有来自所有字符串的叶节点的最深内部节点 在它下面的子树中

正如Justin所说:

String = ABCDE$XABCZ$
    End of word character 1 = $
    └── (0)
        ├── (20) $
        ├── (22) ABC
        │   ├── (15) DE$
        │   └── (23) Z$
        ├── (24) BC
        │   ├── (16) DE$
        │   └── (25) Z$
        ├── (26) C
        │   ├── (17) DE$
        │   └── (27) Z$
        ├── (18) DE$
        ├── (19) E$
        ├── (21) XABCZ$
        └── (28) Z$

在(紧凑)后缀树中,您需要从所有字符串中找到具有叶节点的最深内部节点。 如果在同一深度有多个节点,则必须比较该节点表示的字符串的长度。即 ABC、BC 和 C 都具有相同的深度,因此您必须比较 ABC、BC 和 C 字符串的长度,看看哪个更长;这显然是ABC。

这里我认为从所有字符串中找到具有叶节点的最深内部节点的过程实际上是从所有字符串中找到所有后缀的最长公共前缀的过程。

所以这里有一个问题: 为什么我们不构建前缀树来存储所有字符串的所有后缀?然后我们可以搜索前缀树来找到这些后缀的最长公共前缀。我无法分辨这两者之间的区别。谁能给我一些线索,为什么我们使用后缀树而不是前缀树来解决这个问题?

【问题讨论】:

    标签: string algorithm trie suffix-tree longest-substring


    【解决方案1】:

    对于长度为N 的字符串,后缀树只需要O(N) 时间和空间。这就是为什么使用它可以在线性时间内解决最长公共子串问题的原因。
    在最坏的情况下,将字符串的所有内容添加到 trie 需要 O(N^2) 时间和空间。

    因此,您将所有字符串的所有后缀添加到 trie 的想法实际上是正确的,但与具有后缀树的解决方案相比效率低下。

    【讨论】:

      【解决方案2】:

      trie 用于字典。它不存储后缀。

      【讨论】:

      • 但是我们可以用所有字符串的所有后缀构建一个 trie,对吧?这是否意味着所有后缀所有字符串的 trie 就像后缀树一样?
      • 让我澄清一下:您可以在树的顶部构建后缀树。这很天真,但很有效。 ukkonen 算法更快。在 trie 中通常没有后缀:stackoverflow.com/questions/13893950/…
      猜你喜欢
      • 2012-10-07
      • 1970-01-01
      • 2013-01-25
      • 2011-12-23
      • 2018-09-30
      • 1970-01-01
      • 2012-06-15
      • 2021-09-11
      • 1970-01-01
      相关资源
      最近更新 更多