算法合集之《后缀数组》.ppt
《算法合集之《后缀数组》.ppt》由会员分享,可在线阅读,更多相关《算法合集之《后缀数组》.ppt(66页珍藏版)》请在三一办公上搜索。
1、后缀数组,芜湖一中许智磊,后缀数组字符串处理中的有力武器,后缀树的一个简单而高效的替代品,当今字符串处理研究中的热门,让我们一同揭开她神秘的面纱,后缀数组定义和符号,字符集、字符、字符串都按照惯常的定义,字符串S的长度表示为len(S)字符串的下标从1开始到len(S)结束,字符串S的第i个字符表示为Si从i到j这一段的子串表示为Si.j,后缀是一种特殊的子串从某个位置i开始到整个串的末尾结束S的从i开头的后缀等价于Si.len(S),后缀数组定义和符号,约定一个字符集待处理的字符串约定为S,约定len(S)=n,规定S以字符“$”结尾,即Sn=“$”“$”小于中所有的字符除了Sn=“$”之外
2、,S的其他字符都属于,对于约定的字符串S,其i开头的后缀表示为Suffix(i),后缀数组定义和符号,字符串的大小关系按照通常所说的“字典顺序”进行比较,我们对S的n个后缀按照字典顺序从小到大排序将排序后的后缀的开头位置顺次放入数组SA中,称为后缀数组,令Ranki保存Suffix(i)在排序中的名次,称数组Rank为名次数组,后缀数组构造方法,把n个后缀当作n个字符串,按照普通的方法进行排序 O(n2),低效的原因 把后缀仅仅当作普通的、独立的字符串,忽略了后缀之间存在的有机联系。,如何构造后缀数组?,后缀数组构造方法,倍增算法(Doubling Algorithm),定义k-前缀比较关系k
3、,=k和k对两个字符串u,v,ukv当且仅当ukvku=kv当且仅当uk=vkukv当且仅当ukvk,后缀数组构造方法,u,v,ukv?u=kv?ukv?,u,v,u2kv?u=2kv?u2kv?,后缀数组构造方法,设u=Suffix(i),v=Suffix(j),后缀u,以i开头,后缀v,以i开头,对u、v在2k-前缀意义下进行比较,比较红色字符相当于在k-前缀意义下比较Suffix(i)和 Suffix(j),比较绿色字符相当于在k-前缀意义下比较Suffix(i+k)和 Suffix(j+k),在2k-前缀意义下比较两个后缀可以转化成在k-前缀意义下比较两个后缀,后缀数组构造方法,把n个
4、后缀按照k-前缀意义下的大小关系从小到大排序将排序后的后缀的开头位置顺次放入数组SAk中,称为k-后缀数组,用Rankki保存Suffix(i)在排序中的名次,称数组Rankk为k-名次数组,后缀数组构造方法,利用SAk可以在O(n)时间内求出Rankk,利用Rankk可以在常数时间内对两个后缀进行k-前缀意义下的大小比较,后缀数组构造方法,如果已经求出Rankk,采用快速排序O(nlogn)采用基数排序O(n),后缀数组构造方法,1-前缀比较关系实际上是对字符串的第一个字符进行比较,后缀数组构造方法,直接根据首字符排序,m=2t且mn,后缀数组构造方法,O(nlogn)求出SAm和Rankm
5、,可以在O(nlogn)时间内求出后缀数组SA和名次数组Rank,后缀数组构造方法,mn,SAm=SARankm=Rank,我们已经在O(nlogn)的时间内构造出了后缀数组SA 和 名次数组Rank,后缀数组方法总结,利用到后缀之间的联系用k-前缀比较关系来表达2k-前缀比较关系,每次可以将参与比较的前缀长度加倍根据SAk、Rankk求出SA2k、Rank2k,参与比较的前缀长度达到n以上时结束,倍增思想,后缀数组辅助工具,仅仅靠后缀数组和名次数组有时候还不能很好地处理问题,后缀数组的最佳搭档LCP,定义两个字符串的最长公共前缀Longest Common Prefixlcp(u,v)=ma
6、xi|u=iv也就是从头开始比较u和v的对应字符持续相等的最远值,后缀数组辅助工具,定义LCP(i,j)=lcp(Suffix(SAi),Suffix(SAj),也就是SA数组中第i个和第j个后缀的最长公共前缀,LCP Theorem对任何1ijnLCP(i,j)=minLCP(k-1,k)|i+1kj,称j-i为LCP(i,j)的“跨度”,LCP Theorem意义为:跨度大于1的LCP值可以表示成一段跨度等于1的LCP值的最小值,若ijLCP(i,j)=LCP(j,i),可以用跨度为1的LCP值来表示任何一个LCP值,后缀数组辅助工具,定义LCP(i,j)=lcp(Suffix(SAi),
7、Suffix(SAj),也就是SA数组中第i个和第j个后缀的最长公共前缀,LCP Theorem对任何1ijnLCP(i,j)=minLCP(k-1,k)|i+1kj,称j-i为LCP(i,j)的“跨度”,LCP Theorem意义为:跨度大于1的LCP值可以表示成一段跨度等于1的LCP值的最小值,后缀数组辅助工具,Suffix(SAi),Suffix(SAj),Suffix(SAi+1),Suffix(SAi+2),后缀数组辅助工具,设heighti=LCP(i-1,i),根据LCP TheoremLCP(i,j)=minheightk|i+1kj,计算LCP(i,j)等价于询问数组heig
8、ht中下标从 i+1 到 j 范围内所有元素的最小值,经典的RMQ(Range Minimum Query)问题!,线段树、排序树 O(nlogn)预处理,O(logn)每次询问标准RMQ方法 O(n)预处理,O(1)每次询问,后缀数组辅助工具,采用一种“神奇的”方法,可以在O(n)时间内计算出height数组,采用标准RMQ方法在O(n)时间内进行预处理,之后就可以在常数时间内算出任何的LCP(i,j),根据lcp(Suffix(i),Suffix(j)=LCP(Ranki,Rankj),可以在常数时间内计算出任何两个后缀的最长公共前缀,后缀数组辅助工具,采用一种“神奇的”方法,可以在O(n
9、)时间内计算出height数组,采用标准RMQ方法在O(n)时间内进行预处理,之后就可以在常数时间内算出任何的LCP(i,j),可以在常数时间内计算出任何两个后缀的最长公共前缀,这是后缀数组最常用以及最强大的功能之一,后缀数组应用举例,几个常见的问题,问题一给定一个字符串S,对它的所有后缀进行排序。,问题二给定一个待匹配串S,每次输入一个模式串P,要求返回P在S中的一个匹配的开头位置,或者返回无匹配。,问题三给定一个字符串S,求出S中的最长回文子串。,O(n2),O(m+n),O(n2),O(nlogn),O(m+logn),O(nlogn),后缀数组应用举例,怎样使用后缀数组?,后缀数组应用
10、举例,回文串顺读和倒读完全一样的字符串,奇回文串字符串u满足:len(u)=p为奇数对任何1i(p-1)/2,ui=up-i+1,偶回文串字符串v满足:len(v)=q为奇数对任何1iq/2,vi=vq-i+1,后缀数组应用举例,字符串T的回文子串T的子串,并且是回文串,字符串T的最长回文子串T的回文子串中长度最大的,给出一个字符串T,求它的最长回文子串,给出最大长度即可设len(T)=m,后缀数组应用举例,分析求最长奇回文子串的算法最长偶回文子串可以类似求出,后缀数组应用举例,枚举奇回文串中间一个字符的位置尽量向两边扩展,后缀数组应用举例,以某个位置为中心向两边扩展的复杂度为O(m)整个算法
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 后缀数组 算法 后缀 数组
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6139548.html