Java Trie vs.后缀树vs.后缀数组

Java Trie vs.后缀树vs.后缀数组,java,arrays,data-structures,trie,Java,Arrays,Data Structures,Trie,哪种结构提供最佳性能结果;trie(前缀树)、后缀树还是后缀数组?还有其他类似的结构吗?这些结构的好Java实现是什么 编辑:在这种情况下,我想在一个大型名称词典和一组大型自然语言文本之间进行字符串匹配,以便在文本上识别词典的名称。使用后缀树,您可以在O(n+m+k)时间内编写将词典与文本匹配的内容,其中n是词典中的字母,m是文本中的字母,k是匹配数。对此,尝试要慢得多。我不确定后缀数组是什么,所以我不能对此发表评论 也就是说,编写代码是非常重要的,而且我不知道有哪一个Java库提供了必要的函数

哪种结构提供最佳性能结果;trie(前缀树)、后缀树还是后缀数组?还有其他类似的结构吗?这些结构的好Java实现是什么


编辑:在这种情况下,我想在一个大型名称词典和一组大型自然语言文本之间进行字符串匹配,以便在文本上识别词典的名称。

使用后缀树,您可以在O(n+m+k)时间内编写将词典与文本匹配的内容,其中n是词典中的字母,m是文本中的字母,k是匹配数。对此,尝试要慢得多。我不确定后缀数组是什么,所以我不能对此发表评论

也就是说,编写代码是非常重要的,而且我不知道有哪一个Java库提供了必要的函数

编辑:在本例中,我希望在一个大型名称词典和一个大型名称集之间进行字符串匹配 自然语言文本,以识别文本上的词典名称

这听起来像是一个应用程序:从字典(在线性时间内)构造一个自动机,然后可以使用它查找多个文本(也在线性时间内)中出现的任何字典单词


(中的描述从维基百科页面的“外部链接”部分链接而来,比页面上的描述更容易阅读。)

您计划执行哪些操作?曾经是C语言中最好的后缀数组实现。

诱导排序算法(称为sais)的实现有一个用于构造后缀数组的Java版本。

trie是发现的第一个此类数据结构

后缀树是对trie的改进(它具有允许线性错误搜索的后缀链接,后缀树修剪trie不必要的分支,因此不需要太多空间)

后缀数组是基于后缀树的精简数据结构(没有后缀链接(错误匹配速度慢),但模式匹配速度非常快)

trie不适合实际使用,因为它占用了太多的空间

后缀树比trie更轻、更快,用于索引DNA或优化一些大型web搜索引擎

在某些模式搜索中,后缀数组的速度比后缀树慢,但占用的空间更少,并且比后缀树的使用范围更广

在同一系列数据结构中:

还有其他实现,CST是后缀树的一个实现,使用后缀数组和一些附加数据结构来获得一些后缀树搜索功能

FCST更进一步,它实现了一个带有后缀数组的采样后缀树

DFCST是FCST的动态版本

扩展:

这两个重要因素是空间使用和操作执行时间。你可能会认为这与现代机器无关,但索引单个人类的DNA需要40G的内存(使用未压缩和未优化的后缀树)。在这么多的数据上建立一个这样的索引可能需要几天的时间。想象一下谷歌,它有很多可搜索的数据,他们需要一个覆盖所有网络数据的大索引,而且他们不会每次有人构建网页时都更改索引。他们为此提供了某种形式的缓存。然而,主要指数可能是静态的。每隔几周左右,他们就会收集所有新的网站和数据,并建立一个新的索引,在新的索引完成后替换旧的索引。我不知道他们使用哪种算法来索引,但它可能是一个在分区数据库上具有后缀树属性的后缀数组

CST使用8GB,但是后缀树操作速度大大降低

后缀阵列可以在大约700兆到2千兆的范围内实现同样的功能。但是,你不会在带有后缀数组的DNA中发现遗传错误(这意味着:用通配符搜索模式要慢得多)

FCST(完全压缩后缀树)可以创建800到1.5千兆字节的后缀树。向CST方向的速度下降很小

DFCST比FCST多使用20%的空间,并且由于FCST的静态实现而失去速度(但是动态索引非常重要)

后缀树的可行(空间方面的)实现并不多,因为很难使操作速度提升补偿数据结构RAM空间成本

也就是说,后缀树有非常有趣的错误模式匹配搜索结果。aho-corasick没有那么快(尽管在某些操作中速度几乎一样快,而不是错误匹配),而boyer-moore则被抛在了身后。

Trie vs后缀树

这两种数据结构都确保了快速查找,搜索时间与查询词的长度成正比,复杂性时间O(m),其中m是查询词的长度

这意味着如果我们有10个字符的查询词,那么我们最多需要10个步骤来找到它

:用于存储字符串的树,其中每个公共前缀有一个节点。字符串存储在额外的叶节点中

:与给定字符串的后缀相对应的trie的紧凑表示,其中具有一个子节点的所有节点都与其父节点合并

def来自: 算法和数据结构词典

通常用于索引字典单词(词典)或任何字符串集 示例D={abcd,abcdd,bxcdf,…,zzzz}

一种后缀树,用于通过在文本的所有后缀上使用相同的数据结构“Trie”来索引文本 T=abcdabcg T的所有后缀={abcdabcg,abcdabc,abcdab,abcda,abcd,abc,ab,a}

现在它看起来像一组字符串。 我们在这组字符串(T的所有后缀)上构建一个Trie

这两种数据结构的构造都是线性的,在时间和空间上都需要O(n)

如果是dic