一、串的模式匹配算法
1、算法目的:
确定主串中所含子串(模式串)第一次出现的位置(定位)。
2、算法应用:
搜索引擎、拼写检查、语言翻译、数据压缩
3、算法种类:
●BF算法(Brute-Force, 又称古典的、经典的、朴素的、穷举的)
●KMP算法(特点:速度快)
二、BF算法(重点掌握)
1、Brute-Froce简称为BF算法,亦称简单匹配算法。采用穷举法的思路。如下图所示:
算法的思路是从S的每一个字符开始依次与T的字符进行匹配。
2、算法描述
int Index BF(SString S, SString T, int pos){
int i=pos, j=1; //pos表示可以从任何一个字符开始,不一定为第一个字符
while (i<=S.length && j<=T.length) { //只要i到了串尾或者j到了串尾就不用循环了,要不然就一直循环
if (s.ch[i]==t.ch[j]) {++i; ++j; } //主串和子串依次匹配下一个字符
else {i=i-j+2;j=1;} //主串、 子串指针回溯重新开始下一次匹配
}
if (j>=T.length)
return i-T.length; //返回匹配的第一个字符的下标
else return 0; //模式匹配不成功
}
算法的进一步解释:
①将主串的第pos个字符和模式串的第一个字符比较,
●若相等,继续逐个比较后续字符;
●若不等,从主串的下一字符起, 重新与模式串的第一个字符比较。
②直到主串的一个连续子串字符序列与模式串相等。返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。
③否则,匹配失败,返回值0。
三、KMP算法(难点)
1、KMP算法较BF算法有较大改进,从而使算法效率有了某种程度的提高。
2、算法的设计思想:利用已经部分匹配的结果而加快模式串的滑动速度,且主串S的指针不必回溯。
3、为此,定义next[j]函数, 表明当模式中第j个字符与主串中相应字符"失配”时,在模式中需重新和主串中该字符进行比较的字符的位置。如下图所示为next[j]函数。
注:next[j]函数中的j和k都是相对于字串(模式串)而言的,与主串无关。即上图中的第一种情况表示字串(模式串)的前k-1个元素等于最后一个元素的前k-1个元素的话并且此时的k最大(因为k可能有多个取值),则next[j]就等于k。j表示字串(模式串)有j个字符。
4、算法描述
int Index KMР(SString S,SString T, int pos) {
i=pos,j =1;
while (i<S.length && j<T.length){
if (j==0||S.ch[i]==T.ch[j]){i++;j++;}
else
j=next[j]; /*i不变j后退*/
}
if (j>T.length) return i-T.length; /*匹配成功*/
else return 0; /*返回不匹配标志*/
}
void get_next(SString T,int &next[]){ //next[j]函数声明
i=1;next[1]=0;j=0;
while(i<T.length){
if(j==0||T.ch[i]==T.ch[j]){
++i; ++j;
next[i]=j;
else
j = next[j];
}
}