Trie、后缀树、后缀数组

2024-01-15

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

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


特里树是第一个被发现的此类数据结构。

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

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

trie 不适合现实世界使用,因为它消耗太多空间。

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

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

在同一族数据结构中:

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

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

DFCST 是 FCST 的动态版本。

扩展:

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

CST 使用 8 GB,但后缀树运算速度大大降低。

后缀阵列可以在大约 700 兆到 2 千兆的范围内执行相同的操作。然而,您不会在具有后缀数组的 DNA 中发现遗传错误(这意味着:使用通配符搜索模式要慢得多)。

FCST(完全压缩后缀树)可以创建 800 到 1.5 GB 的后缀树。朝向 CST 的速度下降相当小。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Trie、后缀树、后缀数组 的相关文章

  • Java中如何对对象数组进行排序?

    我的数组不包含任何字符串 但它包含对象引用 每个对象引用都通过 toString 方法返回名称 id 作者和发布者 public String toString return name n id n author n publisher n
  • 在这种情况下 b 是标量对象吗?

    include
  • Java:将二维字符串数组打印为右对齐表格

    是什么best打印a的单元格的方法String 数组作为右对齐表 例如 输入 x xxx yyy y zz zz 应该产生输出 x xxx yyy y zz zz 这似乎是一个should能够完成使用java util Formatter
  • Map:为 Integer 和 Double 类型定义方法,但不为 String 类型定义方法

    我正在尝试定义一个方法putIfGreaterThan 为了我的新Map class 给定一个键 仅当新值大于旧值时 它才会用新值替换旧值 我知道我可以通过组合来实现这一点 通过有一个private final Map
  • Java:如果数组大小未知,如何初始化?

    我要求用户输入 1 到 100 之间的一些数字并将它们分配到一个数组中 数组大小未初始化 因为它取决于用户输入数字的次数 我应该如何分配数组长度 如果用户输入 5 6 7 8 9 5 个数字 则 int list becomes int l
  • 在实现接口的类上强制使用单例模式

    我最好用一个例子来解释这个问题 我有一个接口模型可用于访问数据 模型可以有不同的实现 可以以各种格式表示数据 例如 XMl txt 格式等 Model不关心格式 可以说这样的一个实现是myxml模型 现在我想强迫myxml模型以及其他所有实
  • Tomcat下的Spring CXF Soap Web服务:找不到服务

    我正在尝试使用 CXF 和 Spring 设置一个在 Tomcat 上运行的简单 CXF Web 服务 我有一个 Web 应用程序初始化程序来引导 CXF servlet public class WebAppInitializer ext
  • 从 Java 应用程序读取的文件是否会调用系统调用?

    我的理解是 请求文件系统路径 例如 aFile 的用户应用程序将调用文件系统并获取所请求文件的虚拟地址 然后应用程序将尝试以该地址作为参数 即作为 CPU 指令 进行读 写操作 执行读取命令时 内存管理单元会将该地址转换为物理地址 并查看页
  • 运行 Espresso 测试时在 Android studio 中找不到属性 android:forceQueryable

    我已经使用 android studio 录制了我的 Android 应用程序 Espresso 测试记录浓缩咖啡测试选项中Run菜单 在记录的最后 我用自己的文件名保存了测试 单击保存按钮后 IDE 会自动在以下位置创建文件Android
  • 在 PHP 中创建关联数组

    我有一个多维数组 shop array array appn1 pub1 pub2 pub3 array appn2 pub1 array appn3 pub1 pub2 每个数组中的第一项是申请编号每个数组中的其余部分是出版号 我得到每个
  • Java 9:AES-GCM 性能

    我进行了一个简单的测试来测量AES GCM https en wikipedia org wiki Galois Counter Mode表现在Java 9 通过在循环中加密字节缓冲区 结果有些令人困惑 本机 硬件 加速似乎有效 但并非总是
  • 可空日期列合并问题

    我在 Geronimo 应用程序服务器上使用 JPA 和下面的 openjpa 实现 我也在使用MySQL数据库 我在更新具有可为空 Date 属性的对象时遇到问题 当我尝试合并 Date 属性设置为 null 的实体时 不会生成 sql
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • Zookeeper 未启动,nohup 错误

    我已经下载了zookeeper 3 4 5 tar gz 解压后我将conf zoo cfg写为 tickTime 2000 dataDir var zookeeper clientPort 2181 现在我尝试通过 bin zkServe
  • 在edittext android中插入imageview

    我想将 imageview 放在 edittext 中 可能吗 我检查了 evernote 应用程序 它能够将照片放在编辑文本部分 我想让我的应用程序完全相同 我如何才能将从图库中选择的图像视图放入编辑文本中 我首先尝试将 imagevie
  • 在 Spark MLlib 上使用 Java 中的 Breeze

    在尝试从Java使用MLlib时 使用微风矩阵运算的正确方法是什么 例如scala 中的乘法很简单 matrix vector 相应的功能在Java中是如何表达的 有一些方法 例如 colon times 可以通过正确的方式调用 breez
  • Julia:将数组数组转换为二维数组

    我有一个数组d包含一个浮点数组 julia gt d 99 element Array Array Float64 1 1 我正在尝试将其转换为二维数组 并且我成功地实现了我的目标 data Array Float64 length d l
  • Selenium Webdriver - 单击多个下拉菜单时出现陈旧元素异常,而 HTML DOM 不会更改

    我尝试自动化一个场景 其中条件是我必须从下拉列表中选择一个选项 然后它旁边有另一个下拉列表 我必须单击下一个下拉列表中的一个选项才能启用按钮 我尝试使用代码 但它仅单击第一个选项 并显示错误为过时的元素引用 元素未附加到页面文档 请帮忙 如
  • ImageIO.read(...) - 非常慢,有更好的方法吗?

    我正在加载大量将在我的应用程序中使用的图标 我计划在服务器启动时从 jar 中加载所有这些 然而 由于数百张图像加起来刚刚超过 9MB 执行此任务仍然需要 30 秒多的时间 我现在正在一个单独的线程中执行此操作 但这让我想知道我是否在代码中
  • 为什么我们不能在函数式接口中重载抽象方法? (爪哇)

    所以我熟悉java中的函数式接口 以及它们与lambda表达式的使用 一个函数式接口只能包含一个抽象方法 当从 lambda 表达式使用这一孤独方法时 您不需要指定其名称 因为接口中只有一个抽象方法 编译器知道这就是您正在引用的方法 Exa

随机推荐

  • 为什么我添加字符时得到的是数字? [复制]

    这个问题在这里已经有答案了 我曾经决定将两个字符加在一起 它给了我一个数字 这是代码 class Main public static void main String args System out println a b Output
  • 如何过滤枚举并在下拉列表中使用它

    我是新来的MVC 5我的目标是过滤我的列表enum我将在下拉列表中显示 public enum DayofWeekType Monday 1 Tuesday 2 Wednesday 3 Thursday 4 Friday 5 Saturda
  • GCC 中的 Makefile.in 没有 Makefile.am?

    我正在阅读 GCC 的源代码并有一些问题 很明显 GCC 是使用 autotools 构建的 但我找不到automake所需的Makefile am文件 GCC的Makefile in文件是手写的吗 如果它们是手工编写的 我在哪里可以找到描
  • 使用 godbolt 进入标准库调用

    我想知道各个编译器是如何实现的std random device 所以我把它放进去godbolt https godbolt org z 24H4SZ 不幸的是 它唯一说的是 std random device operator push
  • 您可以更改 WCF 客户端请求的 XML 声明吗?如果是这样,怎么办?

    我正在编写一个库来使用第三方 Web 服务 我显然无法更改 该库当前设置为 Net Standard 2 0 以便我可以在当前的应用程序 Net Framework 4 6 2 以及未来可能在 Net Core 中开发的项目中使用它 这不是
  • 求最大递增序列的长度

    用于查找整数数组中最大单调递增序列的长度的快速算法是什么 From 维基百科 最长递增子序列 http en wikipedia org wiki Longest increasing subsequence Efficient algor
  • cordova-plugin-file-transfer 的转换错误

    我想使用cordova 文件传输插件 https cordova apache org docs en latest reference cordova plugin file transfer 我通过使用它Ionic Native 传输模
  • 获取.NET中给定字符对和字体的字距调整偏移值

    如何获得给定的 2 个之间的间距调整char在 NET 中 在WPF应用程序中 例如 假设我有字体Times New Roman尺寸的22那是bold 字符将使用什么字距调整A and v 如何在我的 WPF 应用程序中获取该值 如果你徘徊
  • 在实践中如何使用 Ember 中的 findAll 和 peekAll ?

    From EmberJS 文档 http guides emberjs com v2 0 0 models finding records toc retrieving multiple records我有以下两种方法来检索给定类型的所有记
  • 编译OpenCV时出错,致命错误:stdlib.h:没有这样的文件或目录

    我正在尝试编译 OpenCV 我已经尝试过 master 分支 当前提交 dc9602e 和版本 标签 3 1 0 我使用的是Fedora 24 我首先尝试使用Fedora附带的gcc gcc GCC 6 2 1 20160916 Red
  • 检索权限列表

    我正在尝试检索设备中应用程序的权限 奇怪的是 对于某些应用程序 我确实得到了结果 而在其中一些应用程序中 我无法检索任何权限 也许为了获取应用程序的权限列表 应用程序必须设置一些特定的标志 因为如果我尝试以这种方式获取我的应用程序的权限列表
  • 如何在不设置系统范围属性的情况下将 HTTP 代理用于 JAX-WS 请求?

    我有一个应用程序需要向 Internet 上的系统发出 SOAP 客户端请求 因此它需要通过我们的 HTTP 代理 可以通过设置系统范围的值 例如系统属性 来做到这一点 Cowboy style Blow away anything any
  • 为什么 TableAdapter.Fill 数据源之间的性能差异

    我有一个 Windows 窗体应用程序DataGridView居住着一个TableAdapter 我正在使用Fill循环更新UI数据的方法Async像这样子 Private Async Sub updateUI Dim sw As New
  • 如何始终运行 Spyder 项目中的主文件

    我正在开发一个包含多个文件的Python项目 令人烦恼的是我必须在单击运行之前选择描述和调用main的文件 因为如果不是Spyder3 Anaconda 则运行当前选定的文件 如果打开并选择文件 如何从 mainPrjPy py 中的 ma
  • 将 LibTiff 安装到 Visual Studio 2010 [重复]

    这个问题在这里已经有答案了 可能的重复 在 Visual Studio 2010 中使用 LibTiff https stackoverflow com questions 4647791 using libtiff in visual s
  • 将按钮绑定到命令 (Windows Phone 7.5)

    我正在开发我的 Windows Phone 应用程序 它使用一些简单的数据绑定 我已经创建了一个基于 MvvM 编程方法的应用程序 我当前正在开发的应用程序也可以通过 MvvM 方法工作 因为我想让我的代码尽可能干净 所以我正在寻找一种方法
  • 如何与 NHibernate 映射一对多关系中的枚举?

    我有两张单独的桌子 users roles id user id value lt Represented by the enum 还有他们的模型 class User int id IList
  • 在word文档中插入图片

    这是我第一次在 Apache POI 上工作 我要问的问题已经在这个网站上提出了 但没有给出明确的答案 所以我别无选择 只能接受你们的帮助 我正在尝试编写一个java程序 它从一个文件夹中获取图像并将该图像插入到word文档中 我在这个程序
  • 如何将 Django 模型上的属性(虚拟字段)公开为 TastyPie ModelResource 中的字段

    我在 Django 模型中有一个属性 我想通过 TastyPie ModelResource 公开该属性 我的模型是 class UserProfile models Model genderChoices u M u Male u F u
  • Trie、后缀树、后缀数组

    哪种结构提供最佳的性能结果 trie 前缀树 后缀树还是后缀数组 还有其他类似的结构吗 这些结构的良好 Java 实现是什么 编辑 在这种情况下 我想在大型名称词典和大量自然语言文本之间进行字符串匹配 以便识别文本上词典的名称 特里树是第一