【题04】计算最长重复子串--试题解析.doc

【题04】计算最长重复子串--试题解析.doc

ID:62039972

大小:469.50 KB

页数:4页

时间:2021-04-16

【题04】计算最长重复子串--试题解析.doc_第1页
【题04】计算最长重复子串--试题解析.doc_第2页
【题04】计算最长重复子串--试题解析.doc_第3页
【题04】计算最长重复子串--试题解析.doc_第4页
资源描述:

《【题04】计算最长重复子串--试题解析.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、个人收集整理勿做商业用途串运算的应用——子串模式匹配设s为主串,t为模式串,q为s中第一个与t相等的子串。所谓模式匹配指的是⑴若q存在,则计算出q的首字符在s中的位置;⑵若q不存在,则返回0。模式匹配的算法有很多。为便于讨论,以后我们将主串s的长度设为n,匹配指针为k;模式串t的长度设为m。朴素的串匹配算法:1.fork←1ton-m+1 do ifcopy(t,1,m)=copy(s,k,m)then输出k;如果以字符匹配为计算单位的话,这种算法最坏情况下的运行时间为O( (n-m+1)m)。问题是,有没有时效更高的匹配算法?有的,kmp算法就是其中最出色的一个算法

2、。我们从一个实例引出讨论【题4】计算最长重复子串在一个字串中,多次出现的子串称为重复子串。如果这样的子串有多个,则其中长度最长的子串称为最长重复子串。例如s='abcdacdac',则t='cdac'为s的最长重复子串。请你在尽可能短的时间内找出最长重复子串。输入:字符串s,长度不超过255输出:s的最长重复子串分析:1、kmp算法朴素的串匹配算法的时效之所以不尽人意,是因为有重复的计算。看下面的例子:模式t=‘ATATACG’的第6个字符在当前位置无法匹配,朴素的串匹配算法将k递增1,从t的第一个字符开始重新匹配,但实际上此时可将k递增2,从t的第4个字符开始匹配,

3、因为在这之间的匹配肯定会失败。类似的例子随着数据量的增大而越来越多,朴素的串匹配算法将做更多的重复工作,使得时效很低。为什么可以让k递增2,从t的第4个字符开始匹配呢?这是由t的性质决定的。  如上图所示,t的前缀‘ATA’恰好是t的前缀‘ATATA’的后缀,所以如果直到‘ATATA’都匹配成功,而‘ATATAC’匹配失败,则主串s的子串sk+2‥sk+4必定为‘ATA’(因为‘ATATA’在k处匹配成功,sk‥k+4=‘ATATA’),于是t的前缀‘ATA’肯定在k+2处匹配成功。KMP算法正是利用了这种特性使得算法的时间复杂度降为O(n+m)。算法的关键是求t的前

4、缀函数next,使得next[j] =max{k

5、k

6、ext[5]+1==4;t[6]前的任何一个前缀都不含字符‘C’,得出next[7]=1。显然,在s与t顺序匹配的过程中,如果t[j]与主串s的当前字符不匹配,则s的当前字符与t[next[j]]比较,不需要从t[1]开始重新比较。移动的位置与s无关,取决于模式串t本身,求next(j)实际上就相当于用t匹配t的过程。由于这个匹配过程是按照字符顺序依次进行的,因此是一个递推过程。设Typenexttype=array[1..255]ofinteger;Var next:nexttype;             {t的前缀函数}我们通过get_next过程计算模式串t

7、中每个字符的next值procedure get_next(t:string;varnext:nexttype);  varj,k:integer;beginj←1;k←0;next[1]←0;             {初始化}  while j<=length(t)do            {循环,求每一个字符的next值} if(k=0)or(t[j]=t[k])thenbegin    {若不存在可匹配的子串或比较相等,则next[j+1]←next[j]+1}  j←j+1; k←k+1;next[j]←k;      end {then}   else 

8、k←next[k];   {否则依次类推找更短的子串}end; {get_next}显然,如果模式串t的串长为m,则get_next过程的时间复杂度为W(m)。2、使用kmp算法寻找子串我们定义index(s,t)为求模式串t在主串s中位置的函数。让模式串t自左至右在主串s上滑动进行匹配检查。设q为s中第一个与t相等的子串,若q存在,则函数index(s,t)的值为q的首字符在s中的位置,否则函数值为零。(t不能是空串)。 例如:a='bei';b='beiging';c='i';个人收集整理勿做商业用途 则 index(b,a)=1;    ind

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。