版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
后缀数组——字符串处理中的有力武器后缀树的一个简单而高效的替代品当今字符串处理研究中的热门让我们一同揭开她神秘的面纱后缀数组——定义和符号字符集、字符、字符串都按照惯常的定义字符串S的长度表示为len(S)字符串的下标从1开始到len(S)结束字符串S的第i个字符表示为S[i]从i到j这一段的子串表示为S[i..j]后缀是一种特殊的子串从某个位置i开始到整个串的末尾结束S的从i开头的后缀等价于S[i..len(S)]后缀数组——定义和符号约定一个字符集Σ待处理的字符串约定为S,约定len(S)=n规定S以字符“$”结尾,即S[n]=“$”“$”小于Σ中所有的字符除了S[n]=“$”之外,S的其他字符都属于Σ对于约定的字符串S,其i开头的后缀表示为Suffix(i)后缀数组——构造方法把n个后缀当作n个字符串,按照普通的方法进行排序——O(n2)低效的原因——把后缀仅仅当作普通的、独立的字符串,忽略了后缀之间存在的有机联系。如何构造后缀数组?后缀数组——构造方法倍增算法(DoublingAlgorithm)对字符串u,定义uk=u[1..k],len(u)≥ku,len(u)<k定义k-前缀比较关系<k,=k和≤k对两个字符串u,v,u<kv当且仅当uk<vku=kv当且仅当uk=vku≤kv当且仅当uk≤vk后缀数组——构造方法uvu<kv?u=kv?u≤kv?kuvu<2kv?u=2kv?u≤2kv?kk后缀数组——构造方法把n个后缀按照k-前缀意义下的大小关系从小到大排序将排序后的后缀的开头位置顺次放入数组SAk中,称为k-后缀数组用Rankk[i]保存Suffix(i)在排序中的名次,称数组Rankk为k-名次数组后缀数组——构造方法利用SAk可以在O(n)时间内求出Rankk利用Rankk可以在常数时间内对两个后缀进行k-前缀意义下的大小比较后缀数组——构造方法如果已经求出Rankk可以在常数时间内对两个后缀进行k-前缀意义下的比较可以在常数时间内对两个后缀进行2k-前缀意义下的比较可以很方便地对所有的后缀在2k-前缀意义下排序采用快速排序O(nlogn)采用基数排序O(n)可以在O(n)时间内由Rankk求出SA2k也就可以在O(n)时间内求出Rank2k后缀数组——构造方法直接根据首字符排序SA1Rank1O(nlogn)SA2Rank2O(n)SA4Rank4O(n)SA8Rank8O(n)……O(n)SAmRankmO(n)m=2t且m≥nO(nlogn)的操作一次O(n)的操作[logn]次总复杂度为O(nlogn)后缀数组——构造方法当m≥n时,对任意u=Suffix(x),um=uSuffix(i)≤mSuffix(j)Suffix(i)≤Suffix(j)Suffix(i)<Suffix(j)SAm=SARankm=RankO(nlogn)求出SAm和Rankm可以在O(nlogn)时间内求出后缀数组SA和名次数组Rank后缀数组——构造方法m≥n,SAm=SARankm=Rank我们已经在O(nlogn)的时间内构造出了后缀数组SA和名次数组Rank后缀数组——辅助工具仅仅靠后缀数组和名次数组有时候还不能很好地处理问题后缀数组的最佳搭档——LCP定义两个字符串的最长公共前缀LongestCommonPrefixlcp(u,v)=max{i|u=iv}也就是从头开始比较u和v的对应字符持续相等的最远值后缀数组——辅助工具定义LCP(i,j)=lcp(Suffix(SA[i]),Suffix(SA[j]))也就是SA数组中第i个和第j个后缀的最长公共前缀LCPTheorem对任何1≤i<j≤nLCP(i,j)=min{LCP(k-1,k)|i+1≤k≤j}称j-i为LCP(i,j)的“跨度”,LCPTheorem意义为:跨度大于1的LCP值可以表示成一段跨度等于1的LCP值的最小值若i>jLCP(i,j)=LCP(j,i)可以用跨度为1的LCP值来表示任何一个LCP值后缀数组——辅助工具定义LCP(i,j)=lcp(Suffix(SA[i]),Suffix(SA[j]))也就是SA数组中第i个和第j个后缀的最长公共前缀LCPTheorem对任何1≤i<j≤nLCP(i,j)=min{LCP(k-1,k)|i+1≤k≤j}称j-i为LCP(i,j)的“跨度”,LCPTheorem意义为:跨度大于1的LCP值可以表示成一段跨度等于1的LCP值的最小值后缀数组——辅助工具设height[i]=LCP(i-1,i)根据LCPTheoremLCP(i,j)=min{height[k]|i+1≤k≤j}计算LCP(i,j)等价于询问数组height中下标从i+1到j范围内所有元素的最小值经典的RMQ(RangeMinimumQuery)问题!!!线段树、排序树——O(nlogn)预处理,O(logn)每次询问标准RMQ方法——O(n)预处理,O(1)每次询问后缀数组——辅助工具采用一种“神奇的”方法,可以在O(n)时间内计算出height数组采用标准RMQ方法在O(n)时间内进行预处理之后就可以在常数时间内算出任何的LCP(i,j)根据lcp(Suffix(i),Suffix(j))=LCP(Rank[i],Rank[j])可以在常数时间内计算出任何两个后缀的最长公共前缀后缀数组——辅助工具采用一种“神奇的”方法,可以在O(n)时间内计算出height数组采用标准RMQ方法在O(n)时间内进行预处理之后就可以在常数时间内算出任何的LCP(i,j)可以在常数时间内计算出任何两个后缀的最长公共前缀这是后缀数组最常用以及最强大的功能之一后缀数组——应用举例怎样使用后缀数组?后缀数组——应用举例回文串——顺读和倒读完全一样的字符串奇回文串字符串u满足:len(u)=p为奇数对任何1≤i≤(p-1)/2,u[i]=u[p-i+1]偶回文串字符串v满足:len(v)=q为奇数对任何1≤i≤q/2,v[i]=v[q-i+1]回文串后缀数组——应用举例枚举奇回文串中间一个字符的位置尽量向两边扩展后缀数组——应用举例rrii-r-1i+r+1反射相等以某个位置为中心向两边扩展的复杂度为O(m)整个算法的复杂度为O(m2)后缀数组——应用举例求以一个位置i为中心向两边扩展的最远值是算法的核心部分需要降低这一步的复杂度后缀数组——应用举例$中心ii'=2m-i+2i-ri+ri'+r#求以i为中心向两边扩展的最远值,等价于求Suffix(i)和Suffix(i')的最长公共前缀后缀数组!!!同时和粉红串反射相等T串T'串Suffix(i)和Suffix(i')的公共前缀后缀数组——应用举例解法:初始化答案为0。按照前述方法修改串T,得到串S求出后缀数组SA、名次数组Rank计算height数组并进行标准RMQ方法预处理复杂度:设len(S)=n,则n=2m+2O(m)+O(nlogn)+m*O(1)=O(nlogn)枚举i,计算以i为中心向两边扩展的最远值并更新答案+2*O(n)后缀数组VS后缀树后缀树也可以做到类似的事情后缀数组有什么优势呢?后缀数组VS后缀树后缀数组在信息学竞赛中最大的优势:易于理解,易于编程,易于调试后缀数组比后缀树占用的空间少——处理长字符串,如DNA分析后缀数组VS后缀树时间复杂度的比较按照字符总数|Σ|把字符集Σ分为三种类型:ConstantAlphabet ——|Σ|是一个常数IntegerAlphabet ——|Σ|为字符串长度n的多项式函数GeneralAlphabet ——对|Σ|没有任何限制ConstantAlphabetIntegerAlphabetGeneralAlphabet后缀数组VS后缀树后缀数组是直接针对GeneralAlphabet设计的算法复杂度跟字符集的类型没有关系后缀树则对不同字符集有不同的表现如果采用儿子-兄弟方式来表达后缀树:构造的复杂度为O(n*|Σ|)——显然不适合Integer和GeneralAlphabet,对于|Σ|稍大的ConstantAlphabet也无法胜任解决方法:每个节点建立一棵红黑树来保存儿子,复杂度为O(n*log|Σ|)。——竞赛的时候有时间编吗?结论对于Integer和General以及|Σ|较大的ConstantAlphabet,后缀树甚至在时间复杂度上都无法胜过后缀数组。但是对于|Σ|较小的ConstantAlphabet,后缀树还是有着速度上的优势的。——我们要根据实际情况,因“题”制宜选择合适的数据结构后缀数组——最后的话研究后缀数组,不是因为害怕后缀树的繁琐也没有贬低后缀树,抬高后缀数组的意思对于功能相似的两个数据结构,我们应该灵活地掌握,有比较有选择地使用构造后缀数组用到的倍增思想对我们的思考也是有帮助的后缀数组谢谢大家!后缀数组——关于“$”为什么规定S以“$”结尾?后缀数组——关于“$”设u=Suffix(i),v=Suffix(j)后缀u,以i开头后缀v,以i开头对u、v在2k-前缀意义下进行比较kkkk比较红色字符相当于在k-前缀意义下比较Suffix(i)和Suffix(j)比较绿色字符相当于在k-前缀意义下比较Suffix(i+k)和Suffix(j+k)在2k-前缀意义下比较两个后缀可以转化成在k-前缀意义下比较两个后缀i+kj+k2k-前缀比较关系可以用两个k-前缀比较关系来表达u<2kvu<kvOR(u=kvANDSuffix(i+k)<kSuffix(v,j+k))u=2kv u=kvANDSuffix(i+k)=kSuffix(j+k)u≤2kvu<kvOR(u=kvANDSuffix(i+k)≤kSuffix(j+k))后缀数组——关于“$”iji+kj+k??大于n!!$“$”小于对应的字符不相等后缀数组——关于“$”结尾的“$”避免了下标越界造成无意义表达式的麻烦为什么规定“$”小于Σ中的任何字符?规定“$”不等于Σ中的任何字符可以达到同样的目的?后缀数组——关于“$”ij$相等i开头的后缀<j开头的后缀$小于对应字符仍然能得到i开头的后缀<j开头的后缀原串新串后缀数组——关于“$”规定“$”小于Σ中的任何字符是为了保证在串S结尾添加“$”改造为S'之后,S中的后缀之间的大小关系在S'中依然成立。于是S'的后缀数组、名次数组都和S的一样。另外不难看出S'的height数组和S的也是一样的。在待处理的串后添加“$”不会影响结果的正确性,只是令操作变得方便。后缀数组——关于“$”后缀数组——关于“#”为什么要先在T串后加“#”然后再反射T串?后缀数组——关于“#”$中心ii'i-ri+ri'+r#T串T'串Suffix(i)和Suffix(i')的公共前缀Suffix(i)和Suffix(i')的最长公共前缀不再能准确地反映向两边扩展的最远值因为左边的浅绿色串用到了T'中的字符这是不合实际的后缀数组——关于“#”在T的结尾加上“#”保证了Suffix(i)和Suffix(i')的最长公共前缀能正确反映以i为中心向两边扩展的最远值特殊判断也可以做到这一点,但是加一个“#”稍微方便一些。后缀数组——关于线性算法采用Farach的构造方法,对于IntegerAlphbet,可以在O(n)时间内构造出后缀树我们不打算把Farach方法列入考察范围这个算法实现极为繁琐更像是挖空心思将几个算法凑在一起的“大杂烩”竞赛的有限时间内几乎无法完成后缀数组——关于线性算法后缀数组——关于线性算法即使构造完成了,如果想使用后缀树,还是得想办法处理每个节点指向儿子的指针。对字符总数太大的情况只能排序存储时间复杂度立刻增加到O(nlog|Σ|)并没有得到改善,也未必比后缀数组快后缀数组——关于线性算法访问的时候要二分查找指向儿子的指针几乎所有的基本操作复杂度都要乘上系数log|Σ|某些情况下甚至比后缀数组差,如多模式串匹配后缀数组——关于线性算法只有极少数情况下后缀树才能真正做到线性时间构造,常数时间基本操作Farach构造方法的理论价值大于它在竞赛中的实际价值不适合拿来和本文所讲的后缀数组相比后缀数组——关于线性算法更令人吃惊的是后缀数组也有对IntegerAlphbet情况下线性构造的算法这是一种三分法,比Farach方法优美得多但是我们也无意在本文中探讨后缀数组——关于线性算法虽然说它比Farach方法优美,但是实现起来仍然比倍增算法繁得多不适合在竞赛中使用有兴趣的同学可以自行研究三分法的技巧性显得较强与技巧相比我更加欣赏倍增算法所体现出的深刻思想后缀数组——关于空间从Rankk推出SAk和Rank2k需要两个数组(共2n个整数)以实现基数排序同一时刻Rankk和Rank2k只需要保存一个SA2k可以直接覆盖SAk2n个整数保存结果+2n个整数辅助计算技巧性地操作可以将辅助计算的空间减少至n个整数后缀数组——关于空间后缀树通常有2n个以上节点通常每个节点要两个整数,至少要保存一个整数每个节点两个指针4n个指针+2n个整数至少是4n个指针
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年物流企业六月运输安全方案
- 《交通土建物联网技术及应用》课件 第八章 交通土建物联网的系统集成
- 河北省唐山市玉田县2025-2026学年高二下学期7月期末地理试题(文字版含答案)
- IBM人工智能平台解析
- 职业规划结课心得
- 医药地区经理职业发展规划
- Kensho AI产品深度解析
- 2026年轻工业六月产品质量与品牌建设方案
- 三年级数学上册分数初步课|几分之一
- 《趣味学纪录片赏析|让课堂告别枯燥 爱上学习》
- 京东资产处置项目运营方案
- 凝汽器酸洗方案
- 2026年新版事故应急处置卡模板(新版27类事故分类依据YJT 32-2025要求编制)
- 2021央企党群宣传岗面试上岸必背题目及答案大全
- 教育强国建设三年行动计划(2025-2027年)
- 雨课堂学堂在线学堂云《企业伦理(大连海事)》单元测试考核答案
- 2025年四川省甘孜检察院书记员考试题(附答案)
- 骨科卧床并发症预防护理
- 律所反洗钱内部控制制度
- XX区实验初级中学2026年春季学期初三备考动员会校长鼓劲讲话
- 2025江苏省盐业集团有限责任公司招聘笔试参考题库附带答案详解
评论
0/150
提交评论