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

完整的后缀数组

傅元章
2023-03-14
问题内容

后缀数组将为给定的字符串列表索引所有后缀,但是如果您尝试对所有可能的唯一子字符串进行索引怎么办?我对此有些新意,因此这是我的意思的示例:

给定字符串

abcd

后缀数组索引(至少据我了解)

(abcd,bcd,cd,d)

我想索引(所有子字符串)

(abcd,bcd,cd,d,abc,bc,c,ab,b,a)

我想要的是后缀数组吗?如果是这样,我该怎么做才能索引所有子字符串?如果没有,我应该去哪里找?另外,我会用什么Google来对比“所有子字符串”与“后缀子字符串”?


问题答案:

后缀数组可以满足您的需要,因为每个子字符串都是后缀之一的前缀。具体来说,给定您的后缀数组

abcd bcd cd d

并假设您要查找子字符串“ bc”,那么可以通过查找所有以“ bc”开头的后缀(在这种情况下只有一个“
bcd”)来找到它。由于后缀数组是按字典顺序排序的,因此找到共享某个前缀的所有后缀都对应于后缀数组的二分查找,结果将是后缀数组的一个连续范围的条目。

但是,存在使用后缀数组和辅助数据结构(例如LCP(最长公共前缀)数组或小波树)组合的优化搜索方法。有关此类方法的说明,请参见Navarro的2007年调查(DOI
10.1145 / 1216370.1216372)。

考虑到下面的评论,我建议将每个后缀与其 表示子字符串 数结合起来。在上面的简单示例中,这将是

4 abcd
3 bcd
2 bc
1 d

因为例如第一个后缀“ abcd”代表4个子字符串“ a”,“ ab”,“ abc”,“ abcd”。但是,在更复杂的示例中,假设对于字符串“
abcabxdabe”,后缀数组的前两个条目为

10 abcabxdabe
1 abe

因为第二个条目表示子字符串“ a”,“ ab”和“ abe”,但是“ a”和“ ab”也由第一个条目表示。

如何计算条目代表的子字符串数?->后缀的长度减去与前一个后缀共同的最长前缀的长度。例如,在“ abe”示例中,即3(其长度)减去2(“
ab”的长度,即与上一个条目共享的最长前缀)。因此,可以在后缀数组中一次生成这些数字,如果还生成了LCP(最长公共前缀)数组,则可以更快地生成这些数字。

下一步将是生成累计计数:

10 abcabxdabe
11 abe
16 abxdabe
...

然后找到一种有效的方法来利用累积的计数。例如,如果要按字典顺序获取第13个子字符串,则必须找到第一个条目,其累积计数大于或等于13。这就是上面的“ 16
abxdabe”。然后删除它与上一个条目共享的前缀(产生“ xdabe”),然后跳转到第二个字符之后的位置(因为上一个条目已累积了11,并且13-11 ==
2),因此您得到“ abxd”作为字典编排的第13个子字符串。



 类似资料:
  • 问题内容: 哪种结构提供最佳性能结果;trie(前缀树),后缀树还是后缀数组?还有其他类似的结构吗?这些结构的良好Java实现是什么? 编辑:在这种情况下,我想在大型名称字典和大量自然语言文本之间进行字符串匹配,以便在文本上标识字典的名称。 问题答案: 特里树是第一个发现的这种数据结构。 后缀树是对trie的改进(它具有后缀链接,允许线性错误搜索,后缀树修剪了trie的不必要分支,因此不需要太多空

  • 本文向大家介绍查询C ++中后缀中不同整数的数量,包括了查询C ++中后缀中不同整数的数量的使用技巧和注意事项,需要的朋友参考一下 在这个问题中,我们得到了N个整数的数组。有Q个查询,每个查询包含一个整数值m。我们的任务是创建一个程序来解决C ++中后缀中不同整数的查询。 问题描述-在这里,我们将需要找到从索引(m-1)到(N-1)的子数组中存在的不同整数的总数。其中,m是每个查询中的值。 让我们

  • 问题内容: 我的问题是,为什么MySQL行的整数值带有“ L”后缀?详细信息如下: 以下字典-为便于显示,在此处经过人工格式化- 由MySQL数据库表的各列组成,这些列的压缩结果为从表中读取一次。 我可以通过将这些值传递给int()来删除“ L”,因此,如果该字典位于名为snapped_read的变量中,则可以执行以下操作: 并会改变。 我只是好奇为什么整数会以这种方式出现。 问题答案: 因为在P

  • 我们正在用爪哇在后交后SQL之上构建一个Web应用程序。它相当大且成功,至少应该能够再运行几年。 不幸的是,我们(嗯,我)在设计过程的早期阶段犯了一个严重的错误:所有数据库ID都是整数,从一个共享序列中分发。 Java的max int是2^31-1,所以大约20亿。PostgreSQL的整数类型也是如此。该系统目前每天消耗大约10k个id,而且随着新用户的增加,这个速度还在加快。 总有一天,id会

  • 问题内容: 我正在寻找后缀符号表示法的算法,该算法将产生最小数量的括号。 我发现它会产生很多括号:http : //tajendrasengar.blogspot.com/2011/09/postfix-to- infix-algorithm.html 例如 输入: 结果: 问题答案: 如果您确实希望尽可能地减少括号,则需要执行的操作与链接的算法类似。然而… 您应该为中的每个 复合 操作数存储一个

  • 我想告诉你一个关于后缀数组的故事。在一段时间里,我正在西雅图的一家公司面试,当时好奇的是如何最有效地创建一个用于可执行二进制文件的diff。我的研究给我带来了后缀数组和后缀树。后缀数组只是,将字符串的所有后缀排序,储存到有序列表中。后缀树是类似的,但是比列表更像BSTree。这些算法相当简单,一旦你进行了排序操作,它们就具有很快的性能。他们解决的问题是,找到两个字符串之间最长的公共子串(或者在这种

  • 对于后缀数组的概念,很多人都存在疑惑,为什么要学习后缀数组?那么我们就来说说原因,后缀数组是一个比较强大的处理字符串的算法,是有关字符串的基础算法,所以必须掌握。  学会后缀自动机(SAM)就不用学后缀数组(SA)了?不,虽然SAM看起来更为强大和全面,但是有些SAM解决不了的问题能被SA解决,只掌握SAM是远远不够的。  …… 有什么SAM做不了的例子?  比如果求一个串后缀的lcp方面的应用,

  • 为数字添加序号后缀。 使用模运算符(%)来查找各位和十位的值。查找哪些序号模式数字匹配。如果数字在十位模式中找到,请使用十位的序数。 const toOrdinalSuffix = num => { const int = parseInt(num), digits = [int % 10, int % 100], ordinals = ['st', 'nd', 'rd', '