- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                3.3.2  KMP算法 假设已有next函数,则KMP算法如下: int StrIndex_KMP(char *s,char *t,int pos) /*从串s的第pos个字符开始找首次与串t相等的子串*/ {        int i=pos,j=1,slen,tlen;      while (i=s[0]  j=t[0] ) /*都没遇到结束符*/      {             if (j==0||s[i]==t[j])             {                  i++;                  j++;             }            else            {                  j=next[j];   /*回溯*/            }      }      if (jt[0])        {           return  i-t[0]; /*匹配成功,返回存储位置*/      }      else        {           return  –1;      } } O(m*n)  OR O(m+n)  3.3.2  KMP算法 next函数值仅取决于模式本身而和主串无关。 从分析next函数的定义出发用递推的方法求next函数值。 该如何求next函数呢? 由定义可知: next[1]=0                                                     设 next[j]=k,则有: "t1 t2  …  tk-1" ="tj-k+1 tj-k+2  …  tj-1 " next[j+1]=? 可能有两种情况:    第一种情况:若 tk=tj 则表明在模式串中     "t1 t2  … tk-1 tk " ="tj-k+1 tj-k+2  … tj-1 tj "        next[j+1]=next[j]+1        3.3.2  KMP算法 第二种情况:若tk ≠tj 则: 把求next函数值的问题看成是一个模式匹配问题,整个模式串既是主串又是模式。 当tk ≠tj 时应将模式向右滑动,使得第next[k]个字符和“主串”中的第j个字符相比较。 若next[k]=k′,且t k′=tj,则说明在主串中第j+1个字符之前存在一个最大长度为k′的子串,使得       "t1 t2  …  t k′ "="tj-k′+1 tj- k′+2  …  tj  "     因此:           next[j+1]=next[k]+1                                  		 同理若t k′≠tj,则将模式继续向右滑动至使第next[k′]个字符和tj 对齐,依此类推,直至tj 和模式中的某个字符匹配成功或者不存在任何 k′能匹配成功。     若t1≠tj+1 , 则有:next[j+1]=1                 否则若t1=tj+1 ,则有:next[j+1]=0         3.3.2  KMP算法 求next函数值过程的算法如下: void GetNext(char *t,int next[ ]) /*求模式t的next值并寸入next数组中*/  { 	int i=1,j=0;          	next[1]=0;          	while (it[0])          	{     		while (j0t[i]!=t[j])   		{                      		j=next[j]; 		}                  	i++;                    	j++;                   	if (t[i]==t[j])                    	{                        		next[i]=next[j];                   	}                  	else                    	{                        		next[i]=j;                  	}           } } O(m) 3.3.3  基于KMP算法的应用 ACM/ICPC的实战练习题Oulipo ,[POJ 3461] 题目要求:给出两个字符串,求出模式串T在主串S中出现了多少次。其中T长1万,S长1百万。 解题思路: (1) 因为问题规模较大,所以本题用BF算法肯定超时; (2) 那就用KMP算法,关键还是在于next
                
原创力文档
                        

文档评论(0)