- 1、本文档共76页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数组、串与广义表
第四章 主要内容 用KMP算法实现的快速匹配算法 int AString::fastFind(AString pat, int k, int next[]) { int posP = 0, posT = k; //两个串的扫描指针 int lengthP = pat.curLength; //模式串长度 int lengthT = curLength; //主串长度 while (posP lengthP posT lengthT) if (posP == -1 || pat.ch[posP] == ch[posT]) { posP++; posT++; } //对应字符匹配 else posP = next[posP]; //求pat下趟比较位置 if (posP lengthP) return -1; //匹配失败 else return posT-lengthP; //匹配成功 }; * 示例 主串T: a c a b a a b a a b c a c a a b c 模式串P: * j 0 1 2 3 4 5 6 7 P a b a a b c a c next(j) -1 0 0 1 1 2 0 1 a b a a b c a c posT posP 示例 主串T: a c a b a a b a a b c a c a a b c 模式串P: * j 0 1 2 3 4 5 6 7 P a b a a b c a c next(j) -1 0 0 1 1 2 0 1 a b a a b c a c posT posP 示例 主串T: a c a b a a b a a b c a c a a b c 模式串P: * j 0 1 2 3 4 5 6 7 P a b a a b c a c next(j) -1 0 0 1 1 2 0 1 a b a a b c a c posT posP 示例 主串T: a c a b a a b a a b c a c a a b c 模式串P: * j 0 1 2 3 4 5 6 7 P a b a a b c a c next(j) -1 0 0 1 1 2 0 1 a b a a b c a c posT posP 示例 主串T: a c a b a a b a a b c a c a a b c 模式串P: * j 0 1 2 3 4 5 6 7 P a b a a b c a c next(j) -1 0 0 1 1 2 0 1 a b a a b c a c posT posP posP=lengthP 设模式 P = p0p1...pm-2pm-1,next特征向量定义: 示例 j 0 1 2 3 4 5 6 7 P a b a a b c a c next(j) -1 0 0 1 1 2 0 1 * 求next[j]的函数 以前面的例子说明: j 0 1 2 3 4 5 6 7 P a b a a b c a c next [j] -1 0 0 1 1 2 0 1 * j=4 k=1 p3?p1 k=nk=0 p3=p0 n4= =k+1 =1 j=3 k=0 n3= =k+1 =1 j=2 k=0 p1?p0 k=nk= =-1 n2= =k+1 =0 j=1 k=-1 n1= =k+1 =0 j=0 n0=-1 j=5 k=1 p4=p1 n5= =k+1 =2 j=6 k=2 p5?p2 k=nk=0 p5?p0 k=nk=-1 n5=k+1=0 j=7 k=0 p6=p0 n7=k+1 =1 对当前串计算next特征向量的算法 void AString::getNext(int next[]) { int j = 0, k = -1, lengthP = curLength; next[0] = -1; while (j lengthP) //计算next[j] if ( k == -1 || ch[j] == ch[k]) { j++; k++; next[j] = k; } else k = next[k]; }; * 课堂练习 * 主串T: a c a b a a b a a b c a c a
文档评论(0)