栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

完整的后缀数组

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

完整的后缀数组

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

abcd bcd cd d

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

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

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

4 abcd3 bcd2 bc1 d

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

10 abcabxdabe1 abe

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

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

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

10 abcabxdabe11 abe16 abxdabe...

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/386928.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号