当前位置: 首页 > 面试题库 >

特里vs.后缀树vs.后缀数组

李兴为
2023-03-14
问题内容

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

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


问题答案:

特里树是第一个发现的这种数据结构。

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

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

该Trie不适用于现实世界,因为它占用了太多空间。

后缀树比trie更轻,更快,并且用于索引DNA或优化某些大型Web搜索引擎。

后缀数组在某些模式搜索中比后缀树慢,但使用的空间较小,并且比后缀树使用得更广泛。

在同一系列的数据结构中:

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

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

DFCST是FCST的动态版本。

扩展中:

两个重要因素是空间使用和操作执行时间。您可能会认为,对于现代机器而言,这无关紧要,但是索引一个人的DNA将需要40
GB的内存(使用未压缩且未优化的后缀树)。而要在如此多的数据上建立索引之一可能需要几天的时间。想象一下Google,它具有大量可搜索的数据,它们需要对所有Web数据进行大索引,并且每次有人构建网页时都不会更改它。他们为此具有某种形式的缓存。但是,主要索引可能是静态的。每隔几周左右,他们就会收集所有新的网站和数据并建立新的索引,并在新索引完成后替换旧索引。我不知道他们使用哪种算法来建立索引,但是它可能是带有分区数据库后缀树属性的后缀数组。

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

后缀数组可以在700兆至2 Gigas的范围内完成相同的操作。但是,您不会在带有后缀数组的DNA中发现遗传错误(这意味着:使用通配符搜索模式要慢得多)。

FCST(完全压缩的后缀树)可以创建800至1.5 gigas的后缀树。速度对CST的影响很小。

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

后缀树没有很多可行的(在空间上)实现,因为很难使操作速度提高来补偿数据结构RAM空间成本。

也就是说,后缀树具有非常有趣的搜索结果,用于模式匹配错误。aho
corasick的速度不快(尽管在某些操作中几乎快,但没有错误匹配),但波耶尔摩尔仍留在尘埃中。



 类似资料:
  • 说到后缀树,我相信很多人通过名字看出来树是一种结构形态,后缀树就是带后缀的结构,后缀,顾名思义,甚至通俗点来说,就是所谓后缀就是后面尾巴的意思。比如说给定一长度为n的字符串S=S1S2..Si..Sn,和整数i,1≤i≤n,子串SiSi+1...Sn便都是字符串S的后缀。当然这样只是通过文字形式上的理解,不够全面,下面我们来看看具体的定义和表现形式吧。 什么是后缀树? 后缀树是一种数据结构,能快速

  • 后缀树 1.1、后缀树的定义 后缀树(Suffix tree)是一种数据结构,能快速解决很多关于字符串的问题。后缀树的概念最早由Weiner 于1973年提出,既而由McCreight 在1976年和Ukkonen在1992年和1995年加以改进完善。 后缀,顾名思义,就是后面尾巴的意思。比如说给定一长度为n的字符串S=S1S2..Si..Sn,和整数i,1 <= i <= n,子串SiSi+1…

  • 在我们学习认识后缀平衡树之前,一定要先了解什么是重量平衡树?所谓的重量平衡树是保证操作影响的最大子树大小是最坏的或均摊的或期望的O(logn)。 那什么是后缀平衡树?后缀平衡树是一种动态维护后缀排序的数据结构。具体而言,它支持在串S的开头添加/删除一个字符。 后缀之间的大小由字典序定义,后缀平衡树就是一个维护这些后缀顺序的平衡树,即字符串T的后缀平衡树是T所有后缀的有序集合。后缀平衡树上的一个节点

  • 问题内容: 我有一个名为“ seeder”的软件包: 现在我想用MyFunc前缀调用所有函数 我想要这样的东西: 这个输出: EDIT1 :在此示例中,parentKey是在循环中更改的字符串变量 但是GC说: 使用没有选择器的包播种机 问题答案: 您无法通过函数名称获得函数,而这正是您想要做的。原因是,如果Go工具可以检测到未显式引用某个函数(因此无法访问该函数),则该函数甚至可能无法编译为可执

  • 最长的重复子串问题如下: 给定一个字符串w,找到至少出现在两个位置的w的最长子串。 这个问题可以在线性时间使用后缀树解决,在线性时间使用增强的后缀数组解决。 我的问题是——对于这个问题,有没有不涉及后缀树或后缀数组的线性时间算法?我很好奇,因为后缀树和后缀数组很难编码和操作,如果有一种算法解决这个问题,而不需要这些其他结构的编码或内存开销,那就太好了。 谢谢

  • 我正在尝试重构一个旧的C代码。在某种程度上,我有点像: 因此,要在代码中定义64位文字,可以使用以下内容: 这是用于在Microsoft编译器中使用后缀,在其他编译器中使用后缀。由于我正在为C 17调整它,并且我们的最低要求是使用Visual Studio 2019,是否可以删除它并在任何地方使用,或者是否存在一些问题,最好保持编译器之间的区别?