线性后缀排序算法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
线性后缀排序算法

线性后缀排序算法 安徽 周源 摘要 算法 线性后缀排序算法 时间复杂度 O |∑| + N 空间复杂度 O |∑| + N 问题提出 在2004年信息学冬令营的论文交流会上,许智磊同学就向同学们介绍了一个基于倍增思想的字符串后缀排序的高效算法,时间复杂度为O NlogN ,其中N是字符串的长度。然而由于关于字符串处理的算法系数都比较大,因此这个算法在处理诸如N大于100K的数据时仍显得有些力不从心。 下面就让我们一起研究,看看如何在线形时间内,完成后缀排序操作。 首先还是来回顾一下字符串后缀排序这个问题的由来:设有一个字符串 S s1s2…sN 定义其后缀Suffixi为从第i个字符si开始,直到串末的子串: Suffixi sisi+1…sN 将Suffix1, Suffix2, … SuffixN看作是N个独立的字符串,求它们之间的大小关系: SA1, SA2, … SAN 满足 SuffixSAI SuffixSA2 … SuffixSAN 算法描述 为了便于理解,我们将使用S ‘mississippi’为例,来看看这个算法是如何运行的。 我们在S的末尾补上一个字符0——并默认0小于S中的所有字符。这样即可以保证不影响对问题的求解。而为了避免麻烦的特殊情况,我们保证S的长度|S|为3的倍数加1,如果不是模3余1,则可以添加更多地0,如下图所示: 连着写出Suffix2以及Suffix3,如下: 将这个新的字符串按照每3个字符一分组,由于S的长度是 3k+1 ,因此Suffix1的长度一定是3的倍数,这保证了任意一个分组中要么都全是Suffix1的字符,要么全是Suffix2的字符。 我们可以通过3次时间复杂度为O |∑| 的基数排序,将这些三元组排序,结果如下: 下面一排数字s23表示这些三元组的序号,如序号为1的’i00’为最小的,而序号为5的三元组’ssi’则是最大的。 将s23作为一个字符串递归进行排序,得到s23的后缀数组: SA23的第一项为4,则表示s23的第4个字符引出的后缀是最小的,3则表示s23的第3个后缀是次小的,对应到由Suffix1+Suffix2形成的串中,不难得到这样的一个后缀大小关系: 由于有0这个字典需最小的字符作分割,因此这个顺序也可以写做: 而正如右边的列表说明,这些正是所有模3不为1的后缀。至此,我们已经得到了这些模3不为1后缀的大小顺序,最后的问题则是,如何将模3等于1的后缀按顺序插入这个后缀序列中。 不妨先求出SA23的反函数:Rank23,即给模3不为1的后缀编上序号: 这样我们关心的模3等于0的后缀本身的,可以被表示为如下形式 Suffix1 s1 + Suffix2 ‘m’ + ‘4’ ‘m4’ Suffix4 s4 + Suffix5 ‘s’ + ‘3’ ‘s3’ Suffix7 s7 + Suffix8 ‘s’ + ‘2’ ‘s2’ Suffix10 s10+ Suffix10 ‘p’ + ‘1’ ‘p1’ 这样我们即用长度为2的字符串(二元组)表示出了模3为1的后缀,可以通过两次O N 的基数排序得到模3为1的后缀顺序SA1: Suffix1 Suffix10 Suffix7 Suffix4 而比较从前我们曾经的得到过SA23: Suffix11 Suffix8 Suffix5 Suffix2 Suffix9 Suffix6 Suffix3 最后的问题就是将这两个有序的数列归并成为最终的答案SA! 数列内部的大小关系已经给出,还需要的就是如何比较两个数列间的元素大小。 分两种情况讨论: 模3为2的后缀与模3为1后缀比较:显然有 Suffix3p+2 s3p+2 + Suffix3p+3 Suffix3q+1 s3q+1 + Suffix3q+2 s3p+2和s3q+1都是单个字符,可以迅速比较出结果,而Suffix3p+3和Suffix3q+2显然都属于SA23和Rank23,也是可以快速比较的。 模3为0 3 的后缀与模3为1后缀比较:有 Suffix3p+0 s3p+0 + s3p+1 + Suffix3p+2 Suffix3q+1 s3q+1 + s3q+2 + Suffix3q+3 同上面一种情况类似,前两项都是单个字符,可以迅速比较,而第三个对应项同属于SA23和Rank23,也是可以快速比较的。 综上,由于每次比较时间为O 1 ,所以可以在O N 的时间为完成最后的归并。其过程如下图所示: 而这就是最终我们需要的答案。 复杂度分析 下面我们来进行一下这个算法的复杂度分析:可以看出,在输入一个字符串后,我们的算法除了中间的一步递

文档评论(0)

peain + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档