- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
上述定义的next[]在某些情况下尚有缺陷。 例如,模式“aaaab”在和主串“aaabaaaab”匹配时,当i=3,j=3时,s.data[3]≠t.data[3],由next[j]的指示还需进行i=3、j=2,i=3、j=1,i=3、j=0等三次比较。实际上,因为模式中的第1、2、3个字符和第4个字符都相等,因此,不需要再和主串中第4个字符相比较,而可以将模式一次向右滑动4个字符的位置直接进行i=4,j=0时的字符比较。 这就是说,若按上述定义得到next[j]=k,而模式中pj=pk,则为主串中字符si和pj比较不等时,不需要再和pk进行比较,而直接和pnext[k]进行比较,换句话说,此时的next[j]应和next[k]相同。 为此将next[j]修正为nextval[j]: 比较t.data[j]和t.data[k],若不等,则 nextval[j]=next[j];若相等nextval[j]=nextval[k]; void GetNextval(SqString t,int nextval[]) { int j=0,k=-1; nextval[0]=-1; while (jt.len) { if (k==-1 || t.data[j]==t.data[k]) { j++;k++; if (t.data[j]!=t.data[k]) nextval[j]=k; else nextval[j]=nextval[k]; } else k=nextval[k]; } } 由模式串t求出nextval值 int KMPIndex1(SqString s,SqString t) { int nextval[MaxSize],i=0,j=0,v; GetNextval(t,nextval); while (is.len jt.len) { if (j==-1 || s.data[i]==t.data[j]) { i++;j++; } /*i,j各增1*/ else j=nextval[j]; /*i不变,j后退*/ } if (j=t.len) v=i-t.len; /*返回匹配模式串的首字符下标*/ else v=-1; /*返回不匹配标志*/ return v; } 修改后的KMP算法 j 0 1 2 3 4 t[j] a a a a b next[j] -1 0 1 2 3 nextval[j] -1 -1 -1 -1 3 本章小结 本章基本学习要点如下: (1) 理解串和一般线性表之间的差异。 (2)重点掌握在顺序串上和链串上实现串的基本运算算法。 (3) 掌握串的模式匹配算法。 (4) 灵活运用串这种数据结构解决一些综合应用问题。 练习题4 习题1、2和3。 上机实验题 题1、2 p=t-next; while (p!=NULL) /*将t的所有结点复制到str*/ { q=(LiString *)malloc(sizeof(LiString)); q-data=p-data;q-next=NULL; r-next=q;r=q; p=p-next; } return str; } (6) SubStr(s,i,j) 返回串s中从第i(1≤i≤StrLength(s))个字符开始的、由连续j个字符组成的子串。 LiString *SubStr(LiString *s,int i,int j) { int k; LiString *str,*p=s-next,*q,*r; str=(LiString *)malloc(sizeof(LiString)); r=str; if (i=0 || iStrLength(s) || j0 || i+j
文档评论(0)