【问题标题】:Retrieving a lost string from a trie从 trie 中检索丢失的字符串
【发布时间】:2015-03-06 16:59:56
【问题描述】:

在数据结构考试中,我确实看到了以下问题:

给出了一个后缀 trie。 现在我知道 trie 只保存具有指向字符数组的特定索引的指针。

现在他们声称原始字符串丢失了,我应该只使用 trie 找到字符串。 我不明白,这怎么可能?

【问题讨论】:

  • 如果trie包含单个字符串条目,您可以通过非空数组条目找到它。
  • 确实,trie 包含一个字符串,您能详细说明一下吗?
  • 您应该了解 trie 结构 - 它是经过修改的树,其中每个节点都包含指向下一级节点的指针数组(假设每个字母 26 个)。通过扫描数组跟踪这些关系,您可以看到其中包含哪些单词。
  • 找到trie中最深的叶子就可以得到原始字符串

标签: algorithm data-structures trie


【解决方案1】:

后缀特里树是一种特殊的数据结构,可以看作是一个自动机。 由于这是一个后缀 trie 而不是后缀 tree,因此原始字符串的每个子字符串在表示它的 trie 中都有一个明确的状态。

trie 的任何叶子都将代表原始字符串的特定后缀。由于原始字符串是自身最长的后缀,trie中有一个叶子代表原始字符串,它是trie中最深的叶子。

要恢复原始字符串,您只需从根开始执行BFS,直到找到最深的叶子。复杂度将是 O(N²) 其中 N 是原始字符串的长度(因为后缀树中的节点数是 O(N²))。


编辑:在被否决之后,我坚持我们正在研究后缀树不是后缀树。这些数据结构确实相似,但它们相同!后缀 trie 明确表示其原始字符串的 EVERY 子字符串。另一方面,后缀树仅表示后缀树的分支状态

现在,一个字符串中可以有多少个不同的子字符串? 1 个长度为 N 的子字符串,2 个长度为 N-1,3 个长度为 N-2,... 总计 N( N+1)/2 = O(N²).

【讨论】:

  • 致反对者:您误读了。后缀 tree 将具有线性复杂度。另一方面,后缀 trie 最多可以包含 O(N²) 个节点...因此构建它(或探索它)涉及二次复杂度...参见this 说服自己。
【解决方案2】:

您可以使用类似的字符串和通配符来提供后缀树。我知道最长的子序列和 aho-corasick 算法是可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2012-02-13
    • 2018-05-22
    • 2021-11-05
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多