- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构-04串,数据结构串的基本操作,数据结构串,数据结构串的操作,数据结构,数据结构与算法,数据结构c语言版,数据结构与算法分析,大话数据结构,java数据结构和算法
* * * * * * * * 4.3 正文模式匹配 一般情况下,当T[1…m]在文本S的某一位置匹配失败后,它可以向右移动的位数只与样本T[1…m]和匹配失败的字符位置j有关,样本P可以向右移动的距离,可以根据样本T[1…m]的字符组成计算出来。 如Fig.6.1所示,T[1…m]移动到文本S的某一位置进行匹配时,假设前j-1个字符相等,第j个字符不等,因而匹配失败。这时根据T[1…m]计算出函数next(j)(j∈ {1,…,m}),可令样本T[1…m]右移Δ= j-next(j)位,匹配比较从T[next(j)]开始。 4.3 正文模式匹配 从Fig.6.1中不难看出,函数next(j)的值应为字符串T[1…j-1]从两端计算的最大可匹配的长度再加上1,它可以表示为: next(j)=MAX{ k | T[1..k-1]=T[j-(k-1)..j-1] kj } KMP算法 KMP算法分为两部分,首先计算next()函数,然后进行串匹配。 KmpNext算法描述如下: Input:样本T[1...m],m为样本长度; Output:数组next[1…m],即next函数值。 4.3 正文模式匹配 void KmpNext( char T[], int m, int next[] ) { //计算 next[1..m] int j=1; i=0; next[1]=0 ; while( j=m ) { if( (i==0) || ( T[j] == T[i] ) ) { j++; i++; next[j]=i; } else i=next[i]; } } next(j)=MAX{ k | T[1..k-1]=T[j-(k-1)..j-1] kj } 4.3 正文模式匹配 T= a b a a b c a c j= 1 2 3 4 5 6 7 8 next[j]= i = next(j)=MAX{ k | T[1..k-1]=T[j-(k-1)..j-1] kj } if( (i==0) || ( T[j] == T[i] ) ) { j++; i++; next[j]=i; } else i=next[i]; 0 1 1 0 1 0 1 2 2 1 2 2 3 3 2 1 0 1 1 2 2 4.3 正文模式匹配 int KMP( SString S, SString T, int pos) { //返回子串T中在主串S中第pos个字符之后的位置.不存在为0 i= pos; j=1; while( i = S[0] j = T[0] ) { if( (j==0) || (S[i] == T[j]) ) { ++i; ++j; } //继续 else { j=next[j]; } //右移 [OLD i=i-j+2; j=1;] } if ( j T[0] ) return i-T[0]; else return 0; } // KMP 4.4 正文编辑-串操作应用举例 正文编辑的实质是修改字符数据的形式或格式。 基本操作包括串的查找、插入和删除等基本操作。 处理文本的思路: 利用换页符和换行符把文本划分成若干页,每页有若干行 将文本看成是一个字符串,称为文本串 页为文本串的子串,行又是页的子串 m a i n ( ) { ↙ f l o a t a , b , m a x ; ↙ s c a n f ( “ % f , % f ” , a , b ) ; ↙ i f a b m a x = a ; ↙ e l s e m a x = b ; ↙ } ; ↙ 201 4.4 正文编辑-串操作应用举例 例:有如下源程序清单 main() { float a,b,max; scanf(“%f,%f”,a,b); if ab max=a; else max=b; }; 存入内存后形式如下: 起始地址 m a i n ( ) { ↙└┘└┘ f l o a t └┘ a , b , m a x ; ↙ └┘└┘ s c a n f ( “ %
文档评论(0)