后缀数组及应用 - 北京大学人工智能实验室.pptVIP

后缀数组及应用 - 北京大学人工智能实验室.ppt

  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文档。上传文档
查看更多
后缀数组及应用 - 北京大学人工智能实验室.ppt

后缀数组及应用 孙弘后缀 后缀是指字符串S从某个位置i开始到整个串末尾结束的一个特殊子串 记作Suffix(S,i),简记为Suffix(i) 后缀数组 后缀数组就是将字符串所有后缀排序后的数组,用SA表示:SA[i]记录排序后第i小的后缀的首字母位置,即Suffix(SA[i])在s的所有后缀中是第i小的后缀 由于一个字符串的两个后缀长度不同,所以必然不等,所以 i ≠ j ↔ SA[i]≠SA[j],即SA存的是1..n的一个排列 名次数组 Rank Rank[i]保存的是Suffix(i)在所有后缀中从小到大排列的名次 显然Rank=SA-1 ,即若SA[i]=j,则Rank[j]=i 后缀数组的构造方法 直接快排,O(n2logn),效率很低 基数排序,最坏情况O(n2),也不够好 以上排序方法都没有利用到各个后缀之间的有机联系,所以它们的效率不可能很高 倍增算法(Doubling Algorithm),充分利用了各个后缀之间的联系,将构造后缀数组的最坏时间复杂度成功降至O(nlogn) k-前缀 字符串S的k-前缀:表示从S的第1到第k个字符构成的子串 Sk=S[1..k], k≤len(S) Sk=S, klen(S) 后缀的k-前缀的性质 不难看出: Suffix2k (i)==Suffix2k(j)等价于Suffixk(i) ==Suffixk(j) Suffixk(i+k) ==Suffixk(j+k) Suffix2k (i)Suffix2k(j) 等价于 Suffixk(i) Suffixk(j) || ( Suffixk(i) ==Suffixk(j) Suffixk(i+k) Suffixk(j+k) ) 倍增算法 定义数组SAk,保存1..n的一个排列使得Suffixk(SAk[i])≤ Suffixk(SAk[i+1]),也就是说对所有的后缀在k-前缀比较关系下从小到大排序,并且把排序后的后缀的开头位置顺次放入数组SAk中 定义数组Rankk,将字符串的所有后缀的k-前缀排序,如果相同则看成一组,Rankk[i]表示Suffixk (i)所在的组在其中的排名 注意Rankk=SAk-1未必成立 倍增算法 首先求Rank1,SA1便是对字符串的所有字符进行排序,由于字符种类是有限的,所以可以用桶排序,在O(n)时间内完成 若已经求出Rankk,SAk,则根据k-前缀的性质,将Rankk[i]看作主关键字, Rankk[i+k]看作此关键字,通过基数排序在O(n)时间内构造出Rank2k,SA2k 倍增算法 Rank1,SA1→Rank2,SA2 → Rank4,SA4 →… → Rankm,SAm(m≥n) 一共需要log(n)步,每步需要时间O(n) 所以时间复杂度为O(nlogn) 倍增算法 如果中途发现Rankk [SAk[n]]=n,说明Rankk=SAk-1已经成立,这时已经达到目的,得到SA=SAk, Rank=Rankk 可以用滚动数组,将空间复杂度降为O(n) 最长公共前缀LCP Longest Common Prefix lcp(s1,s2)表示s1与s2的最长公共前缀的长度 定义LCP(i,j)为Suffix(SA[i])与Suffix(SA[j])的最长公共前缀的长度 LCP(i,j)=lcp(Suffix(SA[i]), Suffix(SA[j])) 显然,LCP(i,j)=LCP(j,i) 所以只需考虑ij的情况 LCP的性质 设ij,则LCP(i,j)=min{LCP(k-1,k)|i+1≤k≤j} (LCP Theorem) 定义一个数组Height,令LCP(i-1,i)=Height[i],则LCP(i,j)=min{Height[k]|i+1≤k≤j} 由LCP Theorem得出一个推论: 对i≤jk,LCP(j,k)≥LCP(i,k) (LCP Corollary) 因此只要求出Height数组,便转化为区间求最值问题(RMQ问题) RMQ问题 由于一般查询次数较多,最适合用ST算法(Sparse Table) 实质是动态规划 f[i,j]表示区间[i,i+2j)上的最小值 f[i,j]=min(f[i,j-1],f[i+2j,j-1]) 则区间[l,r]的最小值为min(f[a,k], f[b-2k+1,k])其中k是满足2k≤b-a的最大的k 预处理需要O(nlogn),查询只需O(1) Height的求法 令h[i]=Height[Rank[i]], 则Height[i]=h[SA[i]] 可以证明h[i]≥h[i-1]-1 不严格证明: 设j满足Rank[j]=Rank[i]-1,则h

文档评论(0)

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

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

1亿VIP精品文档

相关文档