后缀树VS尝试 - 用简单的英语,有什么区别?

时间:2013-08-01 06:48:35

标签: algorithm data-structures tree trie suffix-tree

我已经看了this个问题,但我仍然没有看到后缀树和Trie之间的区别。

两者都包含给定字符串的所有子字符串,那么它们彼此之间的区别是什么?

1 个答案:

答案 0 :(得分:13)

后缀树 - 给出了一个大文本。查询 - 在文本中多次搜索任何字词 例: 您正在实现自己的酷文本编辑器与纸牌和小猫=)您将实现CTRL+F功能。可能的实现 - 索引文档(创建后缀树)以及当用户查找某个单词时 - 在树中搜索它。

Trie - 给出了一个大文本。查询 - 在文本中多次搜索预定义字词。
示例: 你正在用扑克和Justin Bieber的粉丝实现你自己很酷的Facebook =)你不希望你的用户发帖。可能的实现 - 创建一些发誓的话。当用户键入一些文本搜索forbiiden单词并将其替换为*。

通常,后缀树= trie。后缀树是某些单词的所有后缀的trie。当你想在字典中搜索某些东西时使用trie。当您在纯文本中搜索某些内容时,请使用后缀树。

重要说明 - 为大文本构建/重建后缀树是一项复杂的操作。更改文本后,必须重新创建后缀树。重建trie是一项微不足道的操作 - 只需在O(wordLength)

中添加新单词即可

<强>结论
后缀树。 您对未来的查询一无所知。为创建后缀树花费一次时间,您就可以处理请求了。 已知信息是文字。请求未知但给出文本而不会经常更改的情况是使用后缀树的候选者。例如,你不能在CTRL+F实现中使用trie(aho-corasick算法) - 因为你根本不能将字典作为aho-corasick的算法的输入。

Trie树。 您对将要执行搜索的文字一无所知。 但您知道将来的查询。花时间为您的查询预处理/准备数据结构,您可以在任何地方执行搜索查询文本。例如,在替换禁止的单词任务中,您不知道用户将发布什么文本,但您知道禁用的单词。 为每个简短的新帖子创建后缀树太愚蠢=) UPD 正如@mightyWOZ在评论中注意到的那样,纯粹的trie不适用但我们可以使用Aho-Corasick算法是对特里的扩展。所以,声明仍然适用于尝试 - 存在使用trie作为基础的方法(Aho-Corasick),预处理查询然后可以处理任何文本。